Json学习笔记之在Unity中如何解析Json文件
一、官方API:https://docs.unity3d.com/ScriptReference/JsonUtility.html
在Unity中使用JsonUtility类对Json进行解析,此类包含三个重要方法,下面进行详解。
二、FromJson方法(反序列化)
将Json转换为object
返回值是一个Object,需要在对应的类或结构体前标记Serializable属性(没标记好像也行 序列化不成功可能就是因为没有标记)。object类型必须支持序列化,其中的字段也必须支持序列化(比如私有类型、标记了NonSerialized属性的类型等不可序列化字段会被忽视)。
只有普通的类/结构体才行, 继承自UnityEngine.Object (比如 MonoBehaviour 或 ScriptableObject)的类则不行。
使用string的此函数可以在后台线程调用,但使用TextAsset的此函数只可以在主线程调用。
using UnityEngine; [System.Serializable] public class PlayerInfo { public string name; public int lives; public float health; public static PlayerInfo CreateFromJSON(string jsonString) { return JsonUtility.FromJson<PlayerInfo>(jsonString); } // Given JSON input: // {"name":"Dr Charles","lives":3,"health":0.8} // this example will return a PlayerInfo object with // name == "Dr Charles", lives == 3, and health == 0.8f. }
三、ToJson(序列化)
将object转换为Json
参数
obj | 要转换为Json的object |
prettyPrint | 如果为true,则格式化输出以确保可读性。如果为false,则将输出格式化为最小大小。默认值为false。 |
返回值是json格式的string。
传入的object必须是支持序列化的:这个object必须继承自MonoBehaviour、ScriptableObject(其他引擎类型使用EditorJsonUtility.Tojson),或者是标记Serializable属性的普通类/结构体。想要包含的字段也必须是支持序列化的,不支持序列化的字段如private、static以及标记了NonSerialized属性的字段等会被忽略。
传入的object不能是基本数据类型如int,float,也不能为数组。想要序列化基本数据类型或者数组,就需要将它们写入一个类或结构体中,再将类/结构体实例化的对象传入即可。
直接传入一个数组,序列化失败 | ![]() |
![]() |
将数组写进类中,将类实例化对象传入,序列化成功 | ![]() |
![]() |
此函数可以在后台线程中执行,但此函数执行过程中不要去修改传入的object的值。
四、FromJsonOverwrite
此函数和FromJson非常类似,只有一点不同:此函数要把Json中的数据读入一个已经存在的对象中,覆盖该对象原来的数据。(FromJson是返回一个新创建的对象)
五、遇到不支持序列化的类型怎么办?
JsonUtilty类能力有限,并不能序列化/反序列化所有类型的数据,比如字典类型。这个时候就要实现Unity提供给我们的一个接口:ISerializationCallbackReceiver
具体说明见官方文档:https://docs.unity3d.com/cn/current/ScriptReference/ISerializationCallbackReceiver.html