如果我被问到这个问题,我很抱歉,因为我错过了一些非常基本的东西。
我有一个课程:
[Serializable]
public class ResponseObject
{
public string id;
public List<PlayerDetails> player_details ;
}
[Serializable]
public class PlayerDetails
{
public int name;
public int image ;
}
在其他脚本中有以下代码(
private ResponseObject resObject = new ResponseObject();
resObject = JsonUtility.FromJson<ResponseObject>(m_apiCallResponse);
现在,当我尝试访问PlayerDetials类中的变量时,我得到了一个
Debug.Log(resObject.player_details[0].name);
错误:调试行的
Object reference not set an instance of an object
我在制作API调用时得到了List的第0个索引的数据,但我仍然遇到上述错误。
但是如果我将对象声明为
,则上面的代码可以正常工作private ResponseObject resObject = new ResponseObject();
resObject .player_details = new List<PlayerDetails>();
resObject = JsonUtility.FromJson<ResponseObject>(m_apiCallResponse);
我错过了什么,我是否需要以上述方式强制声明?
我是否需要在我声明要使[Serializable]
工作的每个课程上放置JsonUtility
,因为如果我错过了每个课程的Serializable,它就无法正常工作?
答案 0 :(得分:0)
现在,当我尝试访问PlayerDetials类中的变量时,如下所示 我得到了一个空例外......
这是因为resObject
变量null
或player_details
是null
。您必须检查resObject
是否为空,然后在访问player_details
之前检查> 0
的长度是否为List
。由于这是player_details.Count
,您必须使用JsonUtility.FromJson
来执行此检查。
当null
无法对json进行反序列化时,这些变量可以为null,因为您的json与类不匹配,或者当json甚至不匹配您的问题中的类时。如果您遗漏[Serializable]
,也可以JsonUtility.FromJson
。
您可以通过提出here来了解您的json是否与您的课程相匹配。请在此答案评论之前执行此操作。
我错过了什么,我是否需要在上面强制声明 方式?
否即可。你不需要像现在这样做。由于您要将string / json转换为object,因此在调用private ResponseObject resObject;
void yourFunction()
{
resObject = JsonUtility.FromJson<ResponseObject>(m_apiCallResponse);
}
之前绝对无需来初始化变量。
这很好:
void yourFunction()
{
ResponseObject resObject = JsonUtility.FromJson<ResponseObject>(m_apiCallResponse);
}
或
JsonUtility.ToJson
现在,如果您使用JsonUtility
,则传递给此函数的变量必须初始化,因为您要将该变量对象转换为string / json。
我是否需要在我声明的每个类上放置[Serializable] 让JsonUtility工作
是即可。您需要这样做才能使用{{1}}序列化/反序列化每个类。