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已經支持序列化字典了,這里就不演示了。如果需要實現的話,還是參考如上的方式,舉一反三。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM