UD3L4——LitJson

LitJson

它是一个第三方库,用于处理Json的序列化和反序列化
LitJson是C#编写的,体积小、速度快、易于使用
它可以很容易的嵌入到我们的代码中
只需要将LitJson代码拷贝到工程中即可

本章代码关键字

1
2
3
4
using LitJson;            //LitJson的命名空间
JsonMapper.ToJson() //LitJson的序列化方法
JsonMapper.ToObject<>() //LitJson的反序列化方法
JsonData //LitJson不用泛型反序列化方法时返回的类型,可以用键值对来获取其中的数据

知识点

  1. LitJson提供的序列化反序列化方法 JsonMapper.ToJson()​ 和 ToObject<>()
  2. LitJson无需加特性
  3. LitJson不支持私有变量
  4. LitJson支持字典序列化反序列化
  5. LitJson可以直接将数据反序列化为数据集合
  6. LitJson反序列化时 自定义类型需要无参构造,尤其是重载了构造函数的类,一定要额外加上无参构造函数
  7. Json文档编码格式必须是UTF-8

获取LitJson

  1. 前往LitJson官网
  2. 通过官网前往GitHub获取最新版本代码
  3. 讲代码拷贝到Unity工程(注意!只需要拷贝src文件下的litjson文件夹即可!且可以只保留C#文件的部分) 即可开始使用LitJson

使用LitJson进行序列化

参数:类对象

1
JsonMapper.ToJson()
1
2
3
MrTang2 t = new MrTang2();
string JsonStr = JsonMapper.ToJson(t);
File.WriteAllText(Application.persistentDataPath + "/MrTang2.json", JsonStr);

序列化注意事项

  1. 相对JsonUtlity不需要加特性
  2. 不能序列化私有变量
  3. 支持字典类型,字典的键 建议都是字符串 因为 Json的特点 Json中的键会加上双引号(如果不用字符串,反序列化字典大概率会报错!)
  4. 需要引用LitJson命名空间
  5. LitJson可以准确的保存null类型

使用LitJson反序列化

参数:Json字符串,返回值:JsonData​对象
该方法拥有泛型方法,可以直接使用泛型方法,返回的就是泛型参数里填写的类

1
2
JsonMapper.ToObject()
JsonMapper.ToObject<>()
1
MrTang2 t2 = JsonMapper.ToObject<MrTang2>(JsonStr);

JsonData

JsonData​是LitJson提供的类对象 可以用键值对的形式去访问其中的内容,如果使用.ToObject()​,返回的就是这个类

1
2
3
JsonData data = JsonMapper.ToObject(JsonStr);
print(data["name"]);
print(data["age"]);

反序列化注意事项

  1. 类结构需要无参构造函数,否则反序列化时报错(包括类里面的自定义类也需要无参构造函数!)
  2. 字典虽然支持 但是键在使用为数值时会有问题 需要使用字符串类型

注意事项

  1. LitJson可以直接读取数据集合,甚至可以直接读取字典(只要符合类型的对应格式)

    1
    2
    3
    4
    5
    6
    7
    [
    {"hp":4,"speed":6,"volume":5,"resName":"Airplane/Airplane1","scale":15},
    {"hp":3,"speed":7,"volume":4,"resName":"Airplane/Airplane2","scale":15},
    {"hp":2,"speed":8,"volume":3,"resName":"Airplane/Airplane3","scale":15},
    {"hp":10,"speed":3,"volume":10,"resName":"Airplane/Airplane4","scale":6},
    {"hp":6,"speed":5,"volume":7,"resName":"Airplane/Airplane5","scale":10}
    ]
    1
    2
    JsonStr = File.ReadAllText(Application.persistentDataPath + "/RoleInfo.json");
    RoleInfo2[] arr = JsonMapper.ToObject<RoleInfo2[]>(JsonStr);
  2. 文本编码格式需要是UTF-8 不然无法加载