|
JSON序列化功能将对象与JSON格式这可能是有用的Web服务进行交互时,或是打包和解包的数据到一个基于文本的格式很容易。
在jsonutility类的信息,请参阅统一scriptrefjsonutility网页
简单的用法
JSON序列化功能是建立在一个概念的结构化的JSON,这意味着你描述变量是要创建一个类或结构存储在JSON数据。例如:
[化]
公共类
{
公共国际水平;
公众持股量值;
公共串接
这定义了一个普通的C #类包含三个变量—水平,值,和接-标记为可序列化,这是它与JSON序列化程序必要的工作。你可以创建一个实例吧:
MyClass myObject = new MyClass();
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject.playerName = "Dr Charles Francis";
和序列化到JSON格式的利用jsonutility.tojson:
string json = JsonUtility.ToJson(myObject);
这将导致JSON包含字符串变量:
{“水平”:1,“值”:47.5,“接”:“查尔斯弗兰西斯”}
将JSON返回一个对象,使用jsonutility.fromjson:
myObject = JsonUtility.FromJson<MyClass>(json);
这将创建一个新实例类名设定值的时候使用JSON数据。如果JSON数据中包含的值不在地图领域类名然后,这些值将被忽略,如果JSON数据丢失的字段值类名,然后这些字段会被留在他们所构建的返回对象中的值。
JSON序列化程序目前不支持“非结构化”JSON工作(即导航和编辑JSON作为键-值对任意的树)。如果你需要这样做,你应该找一个更全面的JSON库。
覆盖对象以JSON
它也可能采取反序列化JSON数据和它在一个已经创建的对象,这已经是当前数据覆盖:
jsonutility fromjsonoverwrite(JSON,MyObject);
任何领域的对象的JSON不包含的值将保持不变。这种方法可以让你保持一个最低的配置对象复用先前创建的“补丁”,还故意用JSON对象覆盖这些文件只包含一个小的子集的领域。
请注意,JSON序列化API支持MonoBehaviour和scriptableobject子类以及普通结构/类。然而,当反序列化JSON到子类MonoBehaviour或scriptableobject,你必须使用fromjsonoverwrite;fromjson不支持,将抛出一个异常。
支持的类型
API支持任何MonoBehaviour子类,scriptableobject-子类或普通类/结构与[化]属性。对象在你通过送入处理标准统一串行,所以相同的规则和限制他们在督察;唯一的字段都会被序列化,和类型Dictionary不支持。
通过其他类型直接的API,例如原始类型或阵列,目前不支持。现在你要在这种类型的类或结构一些种类的。
只有在编辑器中,有一个平行的API—editorjsonutility这允许您将任何UnityEngine的对象。源都从JSON类型。这将生成JSON的包含对象的YAML表示相同的数据。
性能
基准测试显示jsonutility要比流行的速度明显加快。净JSON的解决方案(虽然比一些人少的特点)。
GC的内存使用量最少:
tojson(的)只有返回的字符串内存分配色谱。
fromjson()只有返回的对象分配色谱的记忆,以及任何子对象的需要(例如,如果你反序列化对象包含一个数组,然后GC内存将被分配给数组)。
fromjsonoverwrite()分配色谱的记忆只需写的领域(例如字符串和数组)。如果所有的字段被覆盖的JSON是值类型的,它应该不分配任何GC记忆。
使用jsonutility API从后台线程被允许.作为一个多线程的代码,你应该小心不要访问或修改一个线程对象的序列化/反序列化时,另一个。
控制输出()tojson of the
tojson漂亮的打印支持JSON输出。它默认是关闭的,你可以把它通过真正的作为第二个参数。
字段可以从输出略用[非序列化]属性。
使用fromjson()类型时,事先不知道时间
反序列化的JSON为类或结构中含有“普通”的字段,然后使用这些字段的值进行实际的类型你想要什么。然后将一次成型。
|
|