
·来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找
目录
三、Unity中用JsonUtility进行序列化与反序列化
一、Json的基础结构
1.Json是什么

创建一个文本文件,然后把它的后缀名改成.json,那这个文件就是.json文件了
2.Json的基础语法

Json是一种键值对结构:"建":"值"
2.1.符号相关
- {} 表示一个对象(json是以对象来保存数据集合的)
- [] 表示一个数组
- : 表示键值对应关系
- , 表示数据之间的分割
- "" 表示建 或者 字符串值(建必须用双引号,且不能用单引号)
2.2.键值对表示
"键名":值内容
值可以是:数字(整数或小数)、字符串、true和false、数组、对象、null
示例:
{
"name": "萘柰奈",
"atk" : 20,
"def" : 5,
"moveSpeed" : 25.3,
"roundSpeed" : 200.25,
"weapon" : {"id" : 1, "num" : 20},
"listInt" : [1,2,3,4,5],
"itemList" : [{"id" : 2, "num" : 30},{"id" : 2, "num" : 30}],
"itemDic" : {"1" : {"id" : 2, "num" : 30}, "2" : {"id" : 2, "num" : 30}},
"itemDic2" : {"tiaoDan":{"id":2, "num" : 30}, "anMoBang" :{"id":1,"num":20}},
"privateI" : 1,
"protectedI" : 2
}

上面是PlayerInfo的一个类对象的数据在json中的表示
二、通过Excel简单配置Json数据
1.在Excel表中配置相应数据

2.把数据复制粘贴到网站去转化
网站:在线Excel、CSV转JSON格式-BeJSON.com



然后把下面得到的json数据复制粘贴到我们的json文件中就好啦
注意:
- 里面可能会有转化不对的地方,比如这里面ids的1,10,它们应该是要在双引号里面的"1,10"
- 它只是给了我们一个数组类型的数据集合相当于(最外层是中括号[]),所以放到json中的 时候,需要给它最外面再加上一个大括号{},让他作为对象
- 感觉手动这样很麻烦,之后我们可以考虑写个小插件来一键转化
三、Unity中用JsonUtility进行序列化与反序列化

1.序列化
1.1.把对象转化为字符串
//先把传入的对象数据转化成字符串
string jsonStr = JsonUtility.ToJson(obj);
1.2.把字符串写入到文件中
//然后把字符串存入到文件当中
File.WriteAllText(Application.streamingAssetsPath + path, jsonStr);
完整封装方法:
//传入一个对象和文件名,保存到指定的位置
public void SaveToJson<T> (T obj, string path) where T : class
{
if(obj == null) {
print("传入对象为空");
return;
}
//先把传入的对象数据转化成字符串
string jsonStr = JsonUtility.ToJson(obj);
//然后把字符串存入到文件当中
File.WriteAllText(Application.streamingAssetsPath + path, jsonStr);
print("成功保存文件至" + Application.streamingAssetsPath + path);
}
2.反序列化
2.1.从文件中读取到字符串
//先从文件中读取到字符串
string jsonStr = File.ReadAllText(Application.streamingAssetsPath + path);
2.2.把这个字符串转化为对象
//再把字符串转化为对象
T targetObj = JsonUtility.FromJson<T>(jsonStr);
完整封装方法:
//传入一个文件名,从指定位置读取到对象上
//返回一个实例化并有对应数据的对象
public T ReadFromJson<T>(string path) where T :class
{
//先从文件中读取到字符串
string jsonStr = File.ReadAllText(Application.streamingAssetsPath + path);
//再把字符串转化为对象
T targetObj = JsonUtility.FromJson<T>(jsonStr);
return targetObj;
}
3.注意事项
①对对象中包含的数据类,需要给它们加上[System.Serializable]这个特性;对于非public的变量,需要给它们加上[SerializeField]这个特性
②JsonUtility不支持字典类型的存储和读取
③JsonUtility在存入null对象不会是null,而是默认值
④JsonUtility不能把数据反序列化为数据集合,只能反序列化为一个对象。所以要是需要这个数据集合,就需要特地去声明一个包含该数据集合的对象去接收
⑤JsonUtility在读取到对象的数据缺少的时候不会报错,只是不填那个数据了而已
⑥Json文档编码格式必须是UTF-8
四、Unity中用JsonLit进行序列化与反序列化

下载网址:LitJSON/litjson: JSON library for the .Net framework(github上的)

下载完成后把这个都是C#的源文件拖入我们的Unity工程中即可
1.序列化
1.1.把对象转化为字符串
//1.把对象转化为字符串
string jsonStr = JsonMapper.ToJson(obj);
1.2.把字符串存入文件中
//2.把字符串保存到文件中
File.WriteAllText(Application.streamingAssetsPath + "/" + path + ".json", jsonStr);
完整封装方法:
//传入一个对象和文件名,然后用LitJson对他进行保存
public void SaveWithLitJson<T> (T obj, string path) where T : class
{
//1.把对象转化为字符串
string jsonStr = JsonMapper.ToJson(obj);
//2.把字符串保存到文件中
File.WriteAllText(Application.streamingAssetsPath + "/" + path + ".json", jsonStr);
}
2.反序列化
2.1.从Json文件中读取到字符串
//1.先从文件中读取到相应的字符串
string jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/" + path + ".json");
2.2.把字符串转化为对应的类对象
//2.再把字符串转化回对应的类对象并返回
T targetObj = JsonMapper.ToObject<T>(jsonStr);
完整封装方法:
//传入一个文件名,返回一个读取到的类对象
public T LoadWithLitJson<T>(string path) where T : class
{
//1.先从文件中读取到相应的字符串
string jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/" + path + ".json");
//2.再把字符串转化回对应的类对象并返回
T targetObj = JsonMapper.ToObject<T>(jsonStr);
return targetObj;
}
3.注意事项
①LitJson不需要给变量和类添加特性也可以进行序列化。不过它不可以序列化private和protected类型的变量
②LitJson可以序列化字典,但是在反序列化的时候只能正确反序列化键值为字符串类型的字典
③LitJson序列化的类中必须要有一个无参构造函数(如果已经有了有参构造,那会把默认的无参构造顶掉,此时需要再手动写一个)
④LitJson可以反序列化得到数据集合(数组、列表、键为字符串的字典)
⑤LitJson可以正确序列化值为null的对象(而不是保存为默认值)
五、总结
①Json文件通过键值对的形式来保存数据,用{}表示对象,[]表示数组,分号:表示键值对连接,逗号表示数据分割,键必须是双引号包裹的
②把对象序列化后的字符串或者从Json文件中读取字符串用的方法是:File.WriteAllText()和File.ReadAllText()
③JsonUtility进行序列号和反序列化的方法是:JsonUtility.ToJson() 和 JsonUtility.FormJson<T>()
④LitJson进行序列化和反序列化的方法是:JsonMapper.ToJson()和JsonMapper.ToObject<T>()
⑤JsonUtility和LitJson在进行反序列化的时候都需要文件是UTF-8的编码格式
⑥JsonUtility在序列化的时候需要给需要序列化的类和非公有变量加上特性;它不会把值保存为null即使这个值是null,而是保存为默认值;它不支持对字典的序列化和反序列化;即使缺失了数据元素也不会报错,只是空着;它不能够反序列化得到数据集合
⑦LitJson在序列化的时候不用给类加上特性,但是也不能序列化非public的变量;它需要序列化的类变量中需要有无参构造函数;它可以支持对字典进行序列化,但是只能对键是字符串类型的字典顺利进行反序列化;它可以正确保存值为null 的变量,而不是保存为默认值;它可以直接反序列化得到数据集合(包括数组、列表、键为字符串类型的字典)


1066

被折叠的 条评论
为什么被折叠?



