Unity中如何正确加载并处理Json文件

C#

浏览数:59

2019-8-30

AD:资源代下载服务

先看结论

JsonUtility Newtonsoft.json
array 支持 支持
list 支持 支持
dictionary 不支持 支持
hashtable 不支持 支持

测试

下面我们看看具体怎么操作:

  1. 先写一个json文件,我们就叫<<王者荣耀>>里的阿珂为例, 取名ake.json, 放到Resources/Json目录下.
    格式大概如下:
    "name": "阿珂",
    "price": 588,
    "attributes": {
        "position": "打野",
        "attackType": "物理",
        "special": "暴击"
    },
    "skills": [
        {
            "name": "死吻",
            "cool": 0
        },
        {
            "name": "弧光",
            "cool": 4
        },
        {
            "name": "瞬华",
            "cool": 9
        },
        {
            "name": "幻舞",
            "cool": 20
        }
    ]
}

2.然后我们开始写测试代码, 主要就是定义数据结构,然后加载ake.json, 序列化数据:

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

public class JsonTest : MonoBehaviour {

    void Start () {
        TextAsset jsonText = Resources.Load("Json/ake") as TextAsset;
        Hero jsonObj = JsonUtility.FromJson<Hero>(jsonText.text);

        Debug.Log("hero.name=" + jsonObj.name);
        Debug.Log("hero.price=" + jsonObj.price);

        foreach (var skill in jsonObj.skills)
        {
            Debug.Log("skill.name=" + skill.name + "; skill.cool=" + skill.cool);
        }

        foreach (var attribute in jsonObj.attributes)
        {
            Debug.Log("attribute." + attribute.Key + "=" + attribute.Value);
        }
    }

}


[Serializable]
public class Hero {
    public string name;
    public int price;
    public List<Skill> skills;
    public Dictionary<string, string> attributes;
}

[Serializable]
public class Skill {
    public string name;
    public int cool;
}

这个是用JsonUtility解析的, 下面是输出结果

hero.name=阿珂
hero.price=588
skill.name=死吻; skill.cool=0
skill.name=弧光; skill.cool=4
skill.name=瞬华; skill.cool=9
skill.name=幻舞; skill.cool=20
NullReferenceException: Object reference not set to an instance of an object

可以看到解析到Dictionary的时候报错了, 大概意思就是没初始化Dictionary, 但是其实是没有解析成功, 因为上面的List也没有初始化, 但是解析成功了. 所以可以判断JsonUtility不支持解析Dictionary类的数据结构.

3.下面我们看看使用Newtonsoft.json的情况如何:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;   // 必须先引用 namespace

public class JsonTest : MonoBehaviour {

    void Start () {
        TextAsset jsonText = Resources.Load("Json/ake") as TextAsset;
        Hero jsonObj = JsonConvert.DeserializeObject<Hero>(jsonText.text);
        ...//同上
    }

}
...//同上

下面是Newtonsoft.json输出的结果:

hero.name=阿珂
hero.price=588
skill.name=死吻; skill.cool=0
skill.name=弧光; skill.cool=4
skill.name=瞬华; skill.cool=9
skill.name=幻舞; skill.cool=20
attribute.position=打野
attribute.attackType=物理
attribute.special=暴击

我们可以看到 完全可以解析出来. 以上就是全部内容.

注意事项

  1. 一定要把需要序列化的数据结构 [Serializable], 因为 如果不加这个, int, string等单一的类型可以解析, 但是array, list, dictionary ,hashtable等复杂的数据结构不能被序列化
    2.一定要记住: json文件里的字段名字,一定要和自己定义的需要序列化的数据结构里的名字”一模一样”, 否则不会解析成功.

作者:Bitcoder