ListJson序列化与反序列化特定类型--Unity版

somebodyoneday 2020-05-15

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));
}

输出如下:
ListJson序列化与反序列化特定类型--Unity版
序列化自定义类必须要求类里面类型要是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;
    }

输出如下:
ListJson序列化与反序列化特定类型--Unity版
会了序列化,那么反序列也就很简单了。下面只简单实现一下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;
    }

结果如下:
ListJson序列化与反序列化特定类型--Unity版

更多的自定义方式:
灵活度很高,大家想怎么定义就用什么定义。如下我展示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());
            }
        }
    }

结果如下:
ListJson序列化与反序列化特定类型--Unity版
新版的LitJson已经支持序列化字典了,这里就不演示了。如果需要实现的话,还是参考如上的方式,举一反三。