UD3L3——JsonUtility

JsonUtility

JsonUtlity​是Unity自带的用于解析Json的公共类,它可以:

  1. 将内存中对象序列化为Json格式的字符串
  2. 将Json字符串反序列化为类对象

本章代码关键字

1
2
3
4
5
6
File.WriteAllText()        //将字符串存储到指定路径中
File.ReadAllText() //在指定路径文件中读取字符串
[System.Serializable] //序列化特性
[SerializeField] //序列化变量特性
JsonUtility.ToJson() //使用JsonUtlity对类对象进行序列化为Json字符串
JsonUtility.FromJson<>() //将Json字符串反序列化为一个类对象

知识点

  1. 必备知识点 —— File存读字符串的方法 ReadAllText()​ 和 WriteAllText()​
  2. JsonUtlity​提供的序列化反序列化方法 ToJson()​ 和 FromJson()​
  3. 自定义类需要加上序列化特性[System.Serializable]​
  4. 私有保护成员 需要加上[SerializeField]
  5. JsonUtlity​不支持字典
  6. JsonUtlity​不能直接将数据反序列化为数据集合
  7. Json文档编码格式必须是UTF-8

在文件中存读字符串

存储字符串到指定路径文件中

  • 第一个参数 填写的是 存储的路径
  • 第二个参数 填写的是 存储的字符串内容
  • 注意:第一个参数 必须是存在的文件路径 如果没有对应文件夹 会报错
1
2
3
string test = "{\n\t\"name\": \"SevenL\"\n}";
File.WriteAllText(Application.persistentDataPath + "/Test.json", test);
print(Application.persistentDataPath);

在指定路径文件中读取字符串

1
2
string str = File.ReadAllText(Application.persistentDataPath + "/Test.json");
print(str);

使用JsonUtlity进行序列化

序列化:把内存中的数据 存储到硬盘上

参数:要序列化的类对象

1
JsonUtility.ToJson()
1
2
3
4
MrTang t = new MrTang();
//Jsonutility提供了现成的方法 可以把类对象 序列化为 json字符串
string jsonStr = JsonUtility.ToJson(t);
File.WriteAllText(Application.persistentDataPath + "/MrTang.json", jsonStr);

序列化注意事项

  1. float序列化时在Json文件里看起来会有一些误差,但是反序列化时并不影响
  2. 自定义类需要加上序列化特性[System.Serializable]​(最外层的类,或者说要序列化的对象的类可以不加,但类里面的自定义类需要加)
  3. 想要序列化私有变量 需要加上特性[SerializeField]​
  4. JsonUtility不支持字典
  5. JsonUtlity存储null对象不会是null而是默认值的数据

使用JsonUtlity进行反序列化

反序列化:把硬盘上的数据 读取到内存中

参数:Json字符串;要序列化的类型;返回值:object(因此需要as)(这个方法不常用)

泛型方法,泛型填入要序列化的类型,参数:Json字符串,这个方法可以直接返回类对象,因此更常用

1
2
JsonUtility.FromJson()
JsonUtility.FromJson<>()
1
2
3
4
jsonStr = File.ReadAllText(Application.persistentDataPath + "/SevenL
.json");
MrTang t1 = JsonUtility.FromJson(jsonStr, typeof(MrTang)) as MrTang;
MrTang t2 = JsonUtility.FromJson<MrTang>(jsonStr);

反序列化注意事项

如果Json中数据少了,读取到内存中类对象中时不会报错,会返回默认值

JsonUtlity注意事项

  1. JsonUtlity无法直接读取数据集合,会报错(Json文件内为一个中括号[]列表转载多个大括号{}对象)

    如果一定要读取,请将该数据集合包裹在一个对象内

    1
    2
    3
    4
    jsonStr = File.ReadAllText(Application.persistentDataPath + "/RoleInfo.json");
    print(jsonStr);
    //List<RoleInfo> roleInfoList = JsonUtility.FromJson<List<RoleInfo>>(jsonStr);
    RoleData data = JsonUtility.FromJson<RoleData>(jsonStr);
  2. 文本编码格式需要时UTF-8 不然无法加载

补充:从Json文件反序列化并覆写对象

​JsonUtility.FromJsonOverwrite()​