Unity中解決JsonUtility轉換數組失敗的BUG

在使用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

相關文章
相關標籤/搜索