我是否需要在c#unity3d中为主类的子类元素创建对象?

时间:2017-08-28 08:51:50

标签: c# json unity3d

如果我被问到这个问题,我很抱歉,因为我错过了一些非常基本的东西。

我有一个课程:

    [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,它就无法正常工作?

1 个答案:

答案 0 :(得分:0)

  

现在,当我尝试访问PlayerDetials类中的变量时,如下所示   我得到了一个空例外......

这是因为resObject变量nullplayer_detailsnull。您必须检查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}}序列化/反序列化每个类。