【问题标题】:Php To Unity Json / Array Return nullPhp 到 Unity Json / 数组返回 null
【发布时间】:2016-06-05 13:46:17
【问题描述】:

我不明白为什么我的数组返回 Null

在第一个示例中它可以工作,但是当我尝试从 WWW.text 调用它时它返回 null。

工作示例:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class _testScripts_JSON : MonoBehaviour
{

void Start() {

    string text = "{\"items\": [{\"ID\":\"1\",\"char_name\":\"KeeLo\",\"level\":\"12\",\"agility\":\"11\"}]}";

    MyClassList list = MyClassList.CreateFromJSON(text);

    Debug.Log(list.items[0].agility);
}


[System.Serializable]
public class MyClassList
{
    public MyClass[] items;

    public static MyClassList CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<MyClassList>(jsonString);
    }
}

[System.Serializable]
public class MyClass
{
    public int ID;
    public string char_name;
    public int level;
    public int agility;

    public static MyClass CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<MyClass>(jsonString);
    }
}
}

但是这个没有。

  public class _myScripts_loading_content : MonoBehaviour {

[System.Serializable]
public class UsersClassList
{
    public UsersClass[] users;

    public static UsersClassList CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<UsersClassList>(jsonString);
    }
}

[System.Serializable]
public class UsersClass
{
    public int _users_id;
    public string _users_username;
    public string _users_password;
    public string _users_email;
    public string _users_name;
    public string _users_surname;
    public string _users_adress;
    public string _users_zipCode;
    public string _users_phone;
    public string _users_picture;
    public string _users_date_login;
    public string _users_date_registration;
    public string _customers_group_customers_group_name;
    public string _country_country_name;
    public string _users_type_type_name;

    public static UsersClass CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<UsersClass>(jsonString);
    }
}
public IEnumerator LoadingContent()
{   

        WWWForm form = new WWWForm();
        form.AddField("_usersUsername", _scripts_myScripts_connect_to_db._usersUsername_string);
        form.AddField("_usersPassword", _scripts_myScripts_connect_to_db._usersPassword_string);
        form.AddField("_classToCall", _functionCalled);

        WWW w = new WWW("http://localhost/myhouse/_functionCalled.php", form);

        yield return w;

        Debug.Log(w.text);

        UsersClassList _usersList = UsersClassList.CreateFromJSON(w.text);

        Debug.Log(_usersList.users[0]._users_username);
 }

Debug.Log(w.text) 返回这个:

{"users": [{"users_id":"1","users_username":"Kabendji","users_password":"password","users_email":"Kyan.Kabendji@gmail.com","users_name":"Kabendji","users_surname":"Kyan","users_adress":"adress","users_zipCode":"zipCode","users_phone":"phone number","users_picture":null,"users_date_login":"2016-06-05 15:40:49","users_date_registration":"2016-06-01 18:29:29","customers_group_customers_group_name":"Admin Group Test","country_country_name":"Belgium","users_type_users_type_name":"Administrator"}]}

还有 Debug.Log(_usersList.users[0]._users_username);返回空

我认为我可以使用列表来做到这一点,但困扰我的是不明白为什么它不适用于数组。

谢谢!

编辑:

调用加载的脚本

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class _myScripts_connect_to_db : MonoBehaviour {

public Text _messageWarning_text;
public InputField _users_username_inputField, _users_password_inputField;

public string _usersUsername_string, _usersPassword_string;

_myScripts_xml_languages _script_myScripts_xml_languages;
_myScripts_loading_content _script_myScripts_loading_content;

private string _functionCalled = "_login";

// Loading Screen

public GameObject _loadingScreen;

// Animation UI
private Animator _animator_loginPage;


// Use this for initialization

public void Start()
{

    _script_myScripts_xml_languages = GetComponent<_myScripts_xml_languages>();
    _script_myScripts_loading_content = GetComponent<_myScripts_loading_content>();

    _animator_loginPage = GameObject.Find("_login_page").GetComponent<Animator>();

}

public void Connection()
{
    _messageWarning_text.text = "";

    _usersUsername_string = _users_username_inputField.text;
    _usersPassword_string = _users_password_inputField.text;

    if(string.IsNullOrEmpty(_usersUsername_string) || string.IsNullOrEmpty(_usersPassword_string) )
    {
        _messageWarning_text.text = _script_myScripts_xml_languages.Strings["fill_field"] as string;
    }

    else
    {
        WWWForm form = new WWWForm();
        form.AddField("_usersUsername", _usersUsername_string);
        form.AddField("_usersPassword", _usersPassword_string);
        form.AddField("_current_languages", _script_myScripts_xml_languages._current_languages);
        form.AddField("_classToCall", _functionCalled);
        WWW w = new WWW("http://localhost/myhouse/_functionCalled.php", form);
        StartCoroutine(Login(w));
    }
}

  private IEnumerator Login(WWW _connection_w)
  {
    yield return _connection_w;

    if(_connection_w.error == null)
    {
        if (_connection_w.text == _script_myScripts_xml_languages.Strings["loginSuccess"] as string)
        {
            //You're Connected // Do Something.
            _messageWarning_text.text = _connection_w.text;

            _loadingScreen.SetActive(true);

            yield return _script_myScripts_loading_content.StartCoroutine(_script_myScripts_loading_content.LoadingContent());

            _loadingScreen.SetActive(false);

            _animator_loginPage.SetBool("isHidden", true);
            //Debug.Log(_connection_w.text);
        }

        else
        {
            _messageWarning_text.text = _script_myScripts_xml_languages.Strings["error"] as string + _connection_w.text;
        }
    }

    else
    {
        _messageWarning_text.text = _script_myScripts_xml_languages.Strings["error"] as string + _connection_w.text;
    }
  }
  }

【问题讨论】:

  • 您的第二个代码不完整。您不像在第一个代码中那样从 Start 函数调用它......
  • 我没有显示 1000 行代码,但我当然是通过另一个脚本调用它:)
  • 好的,很好。但是你怎么称呼它?展示如何创建 _myScripts_loading_content 的实例以及如何调用它。编辑您的代码并添加该部分。也许这会揭示正在发生的事情
  • 我希望它会有所帮助,但我认为没有问题,因为 Debug.Log(w.text) 正在工作

标签: c# php arrays json unity3d


【解决方案1】:

Debug.Log(w.text) 返回这个:

{"users": [{"users_id":"1","users_username":"Kabendji","users_password":"password","users_email":"Kyan.Kabendji@gmail.com","users_name":"Kabendji","users_surname":"Kyan","users_adress":"adress","users_zipCode":"zipCode","users_phone":"phone number","users_picture":null,"users_date_login":"2016-06-05 15:40:49","users_date_registration":"2016-06-01 18:29:29","customers_group_customers_group_name":"Admin Group Test","country_country_name":"Belgium","users_type_users_type_name":"Administrator"}]}

还有 Debug.Log(_usersList.users[0]._users_username);返回空

UsersClass 中的变量名称命名错误。它们与服务器发送给您的内容不匹配。请从UsersClass 类中每个变量名的开头删除_。

例如,您将用户名命名为_users_username,而不是users_username。所有变量都会受到影响,而不仅仅是一个。

为确保所有拼写正确,请转到 here 并粘贴您从服务器收到的 Json 文件。它会给你一个完整的类和变量名。复制这些变量并将它们替换为您现在拥有的变量。只要确保从每个变量中删除{ get; set; }。 Unity Json 无法使用它。

同时停止将您的课程命名为_classname。第一个字母应该大写而不是下划线。

【讨论】:

  • 我不知道为什么我以前没有检查过。谢谢你,谢谢你的建议,这是我的一个非常糟糕的习惯
  • @Kyan 欢迎您。你必须改变这种习惯,因为除了你之外的任何人都很难阅读代码。您的项目越大,阅读代码就越困难。编码愉快!
猜你喜欢
  • 1970-01-01
  • 2015-01-21
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
相关资源
最近更新 更多