Unity学习--【数据持久化】Json的序列化与反序列化

·来源于唐老狮的视频教学,仅作记录和感悟记录,方便日后复习或者查找

目录

一、Json的基础结构

1.Json是什么

2.Json的基础语法

2.1.符号相关

2.2.键值对表示

二、通过Excel简单配置Json数据

1.在Excel表中配置相应数据

2.把数据复制粘贴到网站去转化

三、Unity中用JsonUtility进行序列化与反序列化

1.序列化

1.1.把对象转化为字符串

1.2.把字符串写入到文件中

完整封装方法:

2.反序列化

2.1.从文件中读取到字符串

2.2.把这个字符串转化为对象

完整封装方法:

3.注意事项

四、Unity中用JsonLit进行序列化与反序列化

1.序列化

1.1.把对象转化为字符串

1.2.把字符串存入文件中

完整封装方法:

2.反序列化

2.1.从Json文件中读取到字符串

2.2.把字符串转化为对应的类对象

完整封装方法:

3.注意事项


一、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 的变量,而不是保存为默认值;它可以直接反序列化得到数据集合(包括数组、列表、键为字符串类型的字典)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萘柰奈

谢谢老板喵

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值