天天看点

【Unity】JsonUtility解析集合(collections)类型(List)

Unity自带的Json解析工具类JsonUtility居然没有API用于解析集合类型,也太鬼扯了吧。

  • https://stackoverflow.com/questions/36239705/serialize-and-deserialize-json-and-json-array-in-unity
  • http://www.boxheadproductions.com.au/deserializing-top-level-arrays-in-json-with-unity/

 下面是一个简单的例子:

Student.json:是一个数组。

[
    {
        "id": "1",
        "name": "A"
    },
    {
        "id": "2",
        "name": "B"
    }
]      

解析Json:

// 解析Json的方法
public void ParseItemJson(string jsonStr)
{
    // 将Json中的数组用一个list包裹起来,变成一个Wrapper对象
    jsonStr = "{ \"list\": " + jsonStr + "}";
    Response<Student> studentList = JsonUtility.FromJson<Response<Student>>(jsonStr);
    foreach (Student item in studentList.list)
    {
        Debug.Log(item.id);
    }
}

// Json解析为该对象
public class Response<T>
{
    public List<T> list;
}

[Serializable]
public class Student
{
    public int id;
    public string name;
}      

坑点:

  • Student类中的属性要与Json中的属性一致,大小写敏感!否则能解析为对象,但对象的属性为默认值(int默认0,string默认null等)。
  • Student类要标记为[Serializable],Response类可以不用标记。
  • Json前面拼接的 \"list\"必须要和Response中的list属性一致,大小写敏感!

根据上面的第三个坑点,对于这种包含数组/集合的数据,后台最好不是直接返回一个数组,而是返回一个对象,对象内部包含一个数组。数据格式如下:

{
    "list": [
        {
            "id": "1",
            "name": "A"
        },
        {
            "id": "2",
            "name": "B"
        }
    ]
}      

 JsonUtility用着实在蛋疼,还是换回熟悉的Newtonsoft.json吧。

  • https://www.newtonsoft.com/json
  • http://www.cnblogs.com/guxin/p/csharp-parse-json-by-newtonsoft-json-net.html

由于Unity使用的.Net Framwork版本太低,直接Nuget下载的Newtonsoft.json是不能安装的。报错如下图:

【Unity】JsonUtility解析集合(collections)类型(List)

解决办法:

  • http://blog.csdn.net/beihuanlihe130/article/details/53676006
  • http://www.xuanyusong.com/archives/4367