虽然Unity有自带的JsonUtility类,但是因为支持的东西太少了而且用的时候有各种限制,比如说不能序列化Dictionary,比如序列化必须要加上Serializable等等,所以我比较习惯的是用Newtonsoft.Json。
Newtonsoft.Json的GitHub地址在此 ,里面可以查看文档,教程等等。
可以到我的资源里面下载,里面附带源码和unitypackage:https://download.csdn.net/download/egostudio/12594735
最简单的用法,比如下面的代码,相信大家很容易掌握吧。
void SimpleFunction()
{
Data data = new Data();
data.id = "1001";
data.age = 2;
//序列化为json
var jsonStr = JsonConvert.SerializeObject(data);
//从Json反序列化回类
var newData = JsonConvert.DeserializeObject(jsonStr);
}
Newtonsoft.Json的功能远远不止如此,有很强的拓展性,比如
public interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
DateTime BirthDate { get; set; }
}
public class Employee : IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
public string Department { get; set; }
public string JobTitle { get; set; }
}
public class PersonConverter : CustomCreationConverter
{
public override IPerson Create(Type objectType)
{
return new Employee();
}
}
//[
// {
// "FirstName": "Maurice",
// "LastName": "Moss",
// "BirthDate": "1981-03-08T00:00Z",
// "Department": "IT",
// "JobTitle": "Support"
// },
// {
// "FirstName": "Jen",
// "LastName": "Barber",
// "BirthDate": "1985-12-10T00:00Z",
// "Department": "IT",
// "JobTitle": "Manager"
// }
//]
List people = JsonConvert.DeserializeObject>(json, new PersonConverter());
IPerson person = people[0];
Console.WriteLine(person.GetType());
// Newtonsoft.Json.Tests.Employee
Console.WriteLine(person.FirstName);
// Maurice
Employee employee = (Employee)person;
Console.WriteLine(employee.JobTitle);
// Support
ITraceWriter traceWriter = new NLogTraceWriter();
//序列化时,提供设置
JsonConvert.DeserializeObject(json,new JsonSerializerSettings(){TraceWriter = traceWriter});
public class NLogTraceWriter : ITraceWriter
{
public TraceLevel LevelFilter
{
// trace all messages. nlog can handle filtering
get { return TraceLevel.Verbose; }
}
public void Trace(TraceLevel level, string message, Exception ex)
{
Debug.Log(message);
}
}
//对变量设置自定义转换类
[JsonConverter(typeof(CustomDictionaryConverter))]
public Dictionary mapSaveData;
///
/// 字典Key为自定义类的序列化
///
///
///
public class CustomDictionaryConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => objectType == typeof(Dictionary);
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, ((Dictionary) value).ToList());
}
public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null) return null;
return serializer.Deserialize[]>(reader).ToDictionary(kv => kv.Key, kv => kv.Value);
}
}
nwetonsoft.Json的用法不止如此,还有很多很丰富的功能,大家可以看看这个文档
https://www.newtonsoft.com/json/help/html/Introduction.htm
参考:
https://stackoverflow.com/questions/24681873/how-can-i-serialize-deserialize-a-dictionary-with-custom-keys-using-json-net/24682429