Unity 中处理Json的方式

UnityEngine.JsonUtility

这个是 Unity 自带的 Json处理方式

// 将 obj 转换成 json
var jsonString = JsonUtility.ToJson(obj, true);

// 将 json 转换成 obj,T 为 obj 的类型
var obj = JsonUtility.FromJson<T>(jsonString);

但这个方式有很大的局限性,就是无法处理 Dictionary 和 Array

System.Runtime.Serialization.Json

这个是 .net 中的序列化库,要求 Unity 开启 .net4.x 支持

为了方便使用,对这个库进行了一下简单的封装

public static class Json
{
    public static T FromJson<T>(string json) where T : class
    {
        using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
        {
            var jsonSerializer = new DataContractJsonSerializer(typeof(T));
            return jsonSerializer.ReadObject(stream) as T;
        }
    }

    public static string ToJson<T>(T obj)
    {
        using (var stream = new MemoryStream())
        {
            var jsonSerializer = new DataContractJsonSerializer(typeof(T));
            jsonSerializer.WriteObject(stream, obj);
            return Encoding.UTF8.GetString(stream.ToArray());
        }
    }
}

这个类使用方式类似 Unity 的 JsonUtility

使用这种方式需要注意

  • 首先,需要开启 .net4.x 支持
  • 在移动平台上(iOS/Android)打包的时候,如果开启了 [Strip Engine Code] 选项,这个库可能会被优化掉,需要强制 link [System.Runtime.Serialization] 这个库,原因在【这里】
<?xml version="1.0" encoding="utf-8"?>
<linker>
    <assembly fullname="System.Runtime.Serialization" preserve="all"/>
</linker>