ListJson序列化与反序列化特定类型--Unity版
Posted 吃大白兔奶糖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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已经支持序列化字典了,这里就不演示了。如果需要实现的话,还是参考如上的方式,举一反三。
以上是关于ListJson序列化与反序列化特定类型--Unity版的主要内容,如果未能解决你的问题,请参考以下文章