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;
}
}
测试结果: