在使用Unity官方提供的JsonUtility類進行JSON轉換時,發現一旦轉換數組就會出現問題。
解決轉換數組的問題以後整理一下代碼並作個記錄。json
BUG現象:數組
using UnityEngine; public class JsonTest : MonoBehaviour { private void Start () { string json = "[1, 2, 3]"; int[] array = new int[] { 1, 2, 3 }; // 數組轉Json print(JsonUtility.ToJson(array)); // 結果: {} // Json轉數組 print(JsonUtility.FromJson<int[]>(json)); // 錯誤:ArgumentException: JSON must represent an object type. } }
解決後:工具
using UnityEngine; public class JsonTest : MonoBehaviour { private void Start () { string json = "[1, 2, 3]"; int[] array = new int[] { 1, 2, 3 }; // 數組轉Json print(JsonUtil.ToJson(array)); // 結果:[1,2,3] print(JsonUtility.ToJson(array)); // 結果: {} // Json轉數組 print(JsonUtil.FromJson<int[]>(json)); // 結果:System.Int32[] print(JsonUtility.FromJson<int[]>(json)); // 錯誤:ArgumentException: JSON must represent an object type. } }
解決思路:code
因爲轉對象沒問題,轉數組纔會產生問題。因此解決思路是:
轉換時遇到數組,在數組外加殼,做爲對象轉成JSON,再去殼。
解析時遇到數組,先套殼轉成對象,再取對象裏的數組。對象
JsonUtil類:字符串
using UnityEngine; /// <summary> /// Json轉換工具類 /// <para>解決JsonUtility轉換數組失敗的問題</para> /// <para>ZhangYu 2018-05-09</para> /// </summary> public static class JsonUtil { /// <summary> 把對象轉換爲Json字符串 </summary> /// <param name="obj">對象</param> public static string ToJson<T>(T obj) { if (obj == null) return "null"; if (typeof(T).GetInterface("IList") != null) { Pack<T> pack = new Pack<T>(); pack.data = obj; string json = JsonUtility.ToJson(pack); return json.Substring(8, json.Length - 9); } return JsonUtility.ToJson(obj); } /// <summary> 解析Json </summary> /// <typeparam name="T">類型</typeparam> /// <param name="json">Json字符串</param> public static T FromJson<T>(string json) { if (json == "null" && typeof(T).IsClass) return default(T); if (typeof(T).GetInterface("IList") != null) { json = "{\"data\":{data}}".Replace("{data}", json); Pack<T> Pack = JsonUtility.FromJson<Pack<T>>(json); return Pack.data; } return JsonUtility.FromJson<T>(json); } /// <summary> 內部包裝類 </summary> private class Pack<T> { public T data; } }
PS:官方Json工具處理簡單的Json還能夠,若是處理複雜的Json,建議用SimpleJSON。string