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

posted @ 2021-04-08 16:26  一白梦人  阅读(1212)  评论(0编辑  收藏  举报