如何让Unity JsonUtility支持数组列表的序列化和反序列化
背景介绍
该死的Unity JsonUtility 默认不支持数组列表的序列化和反序列化,好多项目选择放弃使用,转而使用Litjson,newtonsoft-json等三方库,但是如果开发一个三方库,不想依赖过多的其他库,就会很难受
JsonUtility拓展
方式一
using System;
using System.Collections.Generic;
using UnityEngine;
namespace PPP
{
public static class JsonHelper
{
public static T[] FromJson<T>(string json)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
return wrapper.Items;
}
public static string ToJson<T>(T[] array)
{
Wrapper<T> wrapper = new Wrapper<T>
{
Items = array
};
return JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(List<T> list)
{
Wrapper<T> wrapper = new Wrapper<T>
{
Items = list.ToArray()
};
return JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(T[] array, bool prettyPrint)
{
Wrapper<T> wrapper = new Wrapper<T>
{
Items = array
};
return JsonUtility.ToJson(wrapper, prettyPrint);
}
[Serializable]
private class Wrapper<T>
{
public T[] Items;
}
}
}
方式二
namespace PPP
{
/// <summary>
/// Json转换工具类
/// <para>解决JsonUtility转换数组失败的问题</para>
/// </summary>
public static class JsonUtilityEX
{
/// <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 = UnityEngine.JsonUtility.ToJson(pack);
return json.Substring(8, json.Length - 9);
}
return UnityEngine.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 = UnityEngine.JsonUtility.FromJson<Pack<T>>(json);
return Pack.data;
}
return UnityEngine.JsonUtility.FromJson<T>(json);
}
/// <summary> 内部包装类 </summary>
private class Pack<T>
{
public T data;
}
}
}