Unity中如何正确加载并处理Json文件
2018-03-29 本文已影响186人
Bitcoder
先看结论
空 | JsonUtility | Newtonsoft.json |
---|---|---|
array | 支持 | 支持 |
list | 支持 | 支持 |
dictionary | 不支持 | 支持 |
hashtable | 不支持 | 支持 |
测试
下面我们看看具体怎么操作:
- 先写一个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=暴击
我们可以看到 完全可以解析出来. 以上就是全部内容.
注意事项
- 一定要把需要序列化的数据结构 [Serializable], 因为 如果不加这个, int, string等单一的类型可以解析, 但是array, list, dictionary ,hashtable等复杂的数据结构不能被序列化
2.一定要记住: json文件里的字段名字,一定要和自己定义的需要序列化的数据结构里的名字"一模一样", 否则不会解析成功.