Unity List和 Dictionry序列化成json

工具類-SerializeDictionary、SerializeList

unity JsonUtility無法直接將List和Dictionary直接序列化成json ,序列化出的結果爲{}

如下測試代碼:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class Serialization:MonoBehaviour
{
    private void Start()
    {
        List<string> list = new List<string>();
        Dictionary<string, string> dic = new Dictionary<string, string>();

        for (int index = 0;index<10;index++)
        {
            list.Add("listvalue_"+index);
            dic.Add("key_" + index, "value_" + index);
        }
        string list_json = JsonUtility.ToJson(list);
        Debug.Log("list to json: "+ list_json);

        string dic_json = JsonUtility.ToJson(dic);
        Debug.Log("dic to json: " + dic_json);
    }
}

測試結果如下:

所以 需要對需要序列化的數據進行一些處理。當然也可以使用Json.Net進行序列化 反序列化,這裏不作過多介紹。

以下是封裝後的工具類:

/*********************序列化/反序列化Dictionary***********************/
using System.Collections.Generic;
using UnityEngine;

public class SerializeDictionary
{
    public static string DicToJson<TKey, TValue>(Dictionary<TKey, TValue> dic)
    {
        return JsonUtility.ToJson(new SerializeDictionary<TKey, TValue>(dic));
    }

    public static Dictionary<TKey, TValue> DicFromJson<TKey, TValue>(string str)
    {
        return JsonUtility.FromJson<SerializeDictionary<TKey, TValue>>(str).ToDictionary();
    }
}
/******************************************************************/
using UnityEngine;
using System.Collections.Generic;
using System;

[Serializable]
public class SerializeDictionary<TKey, TValue> : ISerializationCallbackReceiver
{
    [SerializeField]
    List<TKey> keys;
    [SerializeField]
    List<TValue> values;

    Dictionary<TKey, TValue> target;
    public Dictionary<TKey, TValue> ToDictionary() { return target; }

    public SerializeDictionary(Dictionary<TKey, TValue> target)
    {
        this.target = target;
    }

    public void OnBeforeSerialize()
    {
        keys = new List<TKey>(target.Keys);
        values = new List<TValue>(target.Values);
    }

    public void OnAfterDeserialize()
    {
        var count = Math.Min(keys.Count, values.Count);
        target = new Dictionary<TKey, TValue>(count);
        for (var i = 0; i < count; ++i)
        {
            target.Add(keys[i], values[i]);
        }
    }
}

/****************************序列化/反序列化List****************************/
using System.Collections.Generic;
using UnityEngine;

public class SerializeList
{
    public static string ListToJson<T>(List<T> l) 
    {
        return JsonUtility.ToJson(new SerializationList<T>(l));
    }

    public static List<T> ListFromJson<T>(string str) 
    {
        return JsonUtility.FromJson<SerializationList<T>>(str).ToList();
    }
}
/*********************************************************************/
using UnityEngine;
using System.Collections.Generic;
using System;

// List<T>
[Serializable]
public class SerializationList<T>
{
    [SerializeField]
    List<T> target;
    public List<T> ToList() { return target; }

    public SerializationList(List<T> target)
    {
        this.target = target;
    }
}

使用封裝後的工具類序列化List和Dictionary

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class Serialization:MonoBehaviour
{
    private void Start()
    {
        List<string> list = new List<string>();
        Dictionary<string, string> dic = new Dictionary<string, string>();

        for (int index = 0;index<10;index++)
        {
            list.Add("listvalue_"+index);
            dic.Add("key_" + index, "value_" + index);
        }
        string list_json = JsonUtility.ToJson(list);
        Debug.Log("list to json: "+ list_json);
        list_json = SerializeList.ListToJson<string>(list);
        Debug.Log("list to json: " + list_json);

        string dic_json = JsonUtility.ToJson(dic);
        Debug.Log("dic to json: " + dic_json);
        dic_json = SerializeDictionary.DicToJson<string,string>(dic);
        Debug.Log("dic to json: " + dic_json);
    }
}

測試結果如下:

如上,使用封裝後的工具類可實現序列化List和Dictionary成json。

而如果需要序列化一些對象而非int這些簡單的基礎數據類型的話,那麼序列化的對象需要支持序列化 也就是帶[Serializable] 關鍵字,如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class Serialization : MonoBehaviour
{
    private void Start()
    {
        List<Book> list_books = new List<Book>();
        Dictionary<string, Book> dic_books = new Dictionary<string, Book>();
        for (int index = 0; index < 10; index++)
        {
            Book book = new Book("100" + index, "book_" + index);
            list_books.Add(book);
            dic_books.Add("100" + index, book);
        }
        string list_json = SerializeList.ListToJson<Book>(list_books);
        Debug.Log("list to json: " + list_json);

        string dic_json = SerializeDictionary.DicToJson<string, Book>(dic_books);
        Debug.Log("dic to json: " + dic_json);
    }
}

[Serializable]
public class Book
{
    public string book_id;
    public string book_name;
    public Book(string b_id, string b_name)
    {
        book_id = b_id;
        book_name = b_name;
    }
}

測試結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章