一. 基本使用
[Serializable]
public class MyClass
{
public int level;
public float timeElapsed;
public string playerName;
}
MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
string json = JsonUtility.ToJson(myObject);
=>
{"level":1,"timeElapsed":47.5,"playerName":"Dr Charles Francis"}
要将 JSON 转换回对象,请使用 JsonUtility.FromJson:
myObject = JsonUtility.FromJson<MyClass>(json);
- 这将创建一个新的 MyClass 实例,并使用 JSON 数据设置该实例的值。如果 JSON 数据包含的值未映射到 MyClass 中的字段,则将忽略这些值,而如果 JSON 数据缺少 MyClass 字段的值,则这些字段将保留返回对象中的构造值
- JSON 序列化程序当前不支持使用“非结构化”JSON(即,以键/值对的任意树形式导航和编辑 JSON)。如果需要这样做,应采用功能更全面的 JSON 库
二. 用 JSON 覆盖对象
也可以获取 JSON 数据并在已经创建的对象“之上”反序列化该数据,从而覆盖已存在的数据:
JsonUtility.FromJsonOverwrite(json, myObject);
- 在 JSON 中不包含值的对象上的任何字段都将保持不变。此方法允许通过重用先前创建的对象将分配保持在最低限度,并允许故意用仅包含一小部分字段的 JSON 来覆盖对象以便“修补”对象
- 注意,JSON 序列化程序 API 支持 MonoBehaviour 和 ScriptableObject 子类以及普通结构/类。但是,将 JSON 反序列化为 MonoBehaviour 或 ScriptableObject 的子类时,
必须
使用 FromJsonOverwrite;FromJson 不受支持并将抛出异常。
三.支持的类型
四. 性能
-
基准测试表明,JsonUtility 要比流行的 .NET JSON 解决方案快得多(尽管功能比其中一些解决方案更少)
-
GC 内存使用量为最低量:
- ToJson() 仅为返回的字符串分配 GC 内存。
- FromJson() 仅为返回的对象以及所需的所有子对象分配 GC 内存(例如,如果对包含数组的对象进行反序列化,则将为该数组分配 GC 内存)。
- FromJsonOverwrite() 仅根据需要为写入的字段(例如字符串和数组)分配 GC 内存。如果 JSON 覆盖的所有字段都是值类型,则不应分配任何 GC 内存。
- 允许使用后台线程中的 JsonUtility API。与任何多线程代码一样,在一个线程上序列化/反序列化对象时,应注意不要在另一个线程上访问或更改该对象。
五. 控制 ToJson() 的输出
- ToJson 支持完美打印 JSON 输出。此功能默认为关闭状态,但可通过传递 true 作为第二个参数来打开此功能。
- 可使用 [NonSerialized] 属性从输出中省略字段。
六. 未提前知道类型的情况下使用 FromJson()
将 JSON 反序列化为包含“公共”字段的类或结构,然后使用这些字段的值来计算出您想要的实际类型。然后第二次反序列化为该类型。
网友评论