ListJson序列化与反序列化特定类型--Unity版
LitJson如何使用?
在github上有项目网址,下载新的release版本(新版支持序列化字典,以及更多类型)。链接:https://github.com/LitJSON/litjson/releases
在Unity中创建Plugins文件夹,把下好的dll文件放入到Plugins文件夹中既可以了。
LitJson支持什么类型?
支持C#中几乎所有的类型。
但Unity中的例如Vector2、3,Quaternion以及Matrix4x4等。
如何去支持它们?
首先看最简单的情况
支持自定义类的序列化
序列化自定义类:
public class Custom { public int data1; public float data2; public Custom(int data1, float data2) { this.data1 = data1; this.data2 = data2; } } void Start() { List<Custom> list = new List<Custom>(); list.Add(new Custom(1, 2.0f)); list.Add(new Custom(2, 3.0f)); print(JsonMapper.ToJson(list)); }
输出如下:
序列化自定义类必须要求类里面类型要是LitJson支持的。那么如果碰到比如Vector2这种不支持的类型该怎么办呢?马上就讲解。
序列化Vector2类型:
先说一句,LitJson的扩展性很强,在你自己实现自定义解析方案的情况下,LitJson可以支持任何类型。
自己实现类型解析
void Start() { Action<Vector2,JsonWriter> writeVector2 = (v,w) => { w.WriteObjectStart();//开始写入对象 w.WritePropertyName("x");//写入属性名 w.Write(v.x.ToString());//写入值 w.WritePropertyName("y"); w.Write(v.y.ToString()); w.WriteObjectEnd(); }; JsonMapper.RegisterExporter<Vector2>((v,w) => { writeVector2(v,w); }); //在上面注册了自定义的解析方式,当碰到Vector2类型时LitJson就知道该怎么办了 string listJson = List_Vector2Serialized(); print(listJson); var l =List_Vector2DesSerialized(listJson); foreach (var item in l) { print(item.x+" "+item.y); } } /// <summary> /// List<Vector2> 序列化测试 /// </summary> private string List_Vector2Serialized() { string str; List<Vector2> list = new List<Vector2>(); list.Add(new Vector2(1,1)); list.Add(new Vector2(2, 2)); str = JsonMapper.ToJson(list); return str; }
输出如下:
会了序列化,那么反序列也就很简单了。下面只简单实现一下Vector2类型的反序列化。
Vector2类型的反序列化:
void Start() { Action<Vector2,JsonWriter> writeVector2 = (v,w) => { w.WriteObjectStart();//开始写入对象 w.WritePropertyName("x");//写入属性名 w.Write(v.x.ToString());//写入值 w.WritePropertyName("y"); w.Write(v.y.ToString()); w.WriteObjectEnd(); }; JsonMapper.RegisterExporter<Vector2>((v,w) => { writeVector2(v,w); }); //在上面注册了自定义的解析方式,当碰到Vector2类型时LitJson就知道该怎么办了 string listJson = List_Vector2Serialized(); print(listJson); var l =List_Vector2DesSerialized(listJson); foreach (var item in l) { print(item.x+" "+item.y); } } /// <summary> /// List<Vector2> 序列化测试 /// </summary> private string List_Vector2Serialized() { string str; List<Vector2> list = new List<Vector2>(); list.Add(new Vector2(1,1)); list.Add(new Vector2(2, 2)); str = JsonMapper.ToJson(list); return str; } /// <summary> /// List<Vector2> 反序列化测试 /// </summary> private List<Vector2> List_Vector2DesSerialized(string json) { int i = 1; JsonData js = JsonMapper.ToObject(json); List<Vector2> list=new List<Vector2>(); foreach (JsonData item in js) { //print(item.ToString()); list.Add(new Vector2(int.Parse(item["x"].ToString()),int.Parse(item["y"].ToString()))); } return list; }
结果如下:
更多的自定义方式:
灵活度很高,大家想怎么定义就用什么定义。如下我展示Vector3的序列化与反序列化(开发中未必有意义,只是为了展示它的灵活度)
void Start() { Action<Vector3,JsonWriter> writeVector3 = (v,w) => { w.WriteObjectStart(); w.WritePropertyName("valueData"); w.WriteArrayStart(); w.Write(v.x); w.Write(v.y); w.Write(v.z); w.WriteArrayEnd(); w.WriteObjectEnd(); }; JsonMapper.RegisterExporter<Vector3>((v, w) => { writeVector3(v, w); }); string listJson1 = List_Vector3Serialized(); print(listJson1); List_Vector3DesSerialized(listJson1); } /// <summary> /// List<Vector3> 序列化测试 /// </summary> /// <returns></returns> private string List_Vector3Serialized() { string str; List<Vector3> list = new List<Vector3>(); list.Add(new Vector3(1, 2, 3)); list.Add(new Vector3(4, 5, 6)); str = JsonMapper.ToJson(list); return str; } /// <summary> /// List<Vector3> 反序列化测试 /// </summary> /// <param name="json"></param> private void List_Vector3DesSerialized(string json) { JsonData js = JsonMapper.ToObject(json); List<Vector3> list = new List<Vector3>(); foreach (JsonData item in js) { foreach (JsonData data in item["valueData"]) { print(data.ToString()); } } }
结果如下:
新版的LitJson已经支持序列化字典了,这里就不演示了。如果需要实现的话,还是参考如上的方式,举一反三。