美文网首页
Unity JSON序列化

Unity JSON序列化

作者: 86a262e62b0b | 来源:发表于2019-11-06 12:52 被阅读0次

文档

一. 基本使用

[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 不受支持并将抛出异常。

三.支持的类型

四. 性能

  1. 基准测试表明,JsonUtility 要比流行的 .NET JSON 解决方案快得多(尽管功能比其中一些解决方案更少)

  2. GC 内存使用量为最低量:

  • ToJson() 仅为返回的字符串分配 GC 内存。
  • FromJson() 仅为返回的对象以及所需的所有子对象分配 GC 内存(例如,如果对包含数组的对象进行反序列化,则将为该数组分配 GC 内存)。
  • FromJsonOverwrite() 仅根据需要为写入的字段(例如字符串和数组)分配 GC 内存。如果 JSON 覆盖的所有字段都是值类型,则不应分配任何 GC 内存。
  1. 允许使用后台线程中的 JsonUtility API。与任何多线程代码一样,在一个线程上序列化/反序列化对象时,应注意不要在另一个线程上访问或更改该对象。

五. 控制 ToJson() 的输出

  • ToJson 支持完美打印 JSON 输出。此功能默认为关闭状态,但可通过传递 true 作为第二个参数来打开此功能。
  • 可使用 [NonSerialized] 属性从输出中省略字段。

六. 未提前知道类型的情况下使用 FromJson()

将 JSON 反序列化为包含“公共”字段的类或结构,然后使用这些字段的值来计算出您想要的实际类型。然后第二次反序列化为该类型。

相关文章

网友评论

      本文标题:Unity JSON序列化

      本文链接:https://www.haomeiwen.com/subject/yjkubctx.html