一、官方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