Unity Json序列化高级用法介绍

虽然Unity有自带的JsonUtility类,但是因为支持的东西太少了而且用的时候有各种限制,比如说不能序列化Dictionary,比如序列化必须要加上Serializable等等,所以我比较习惯的是用Newtonsoft.Json。

Newtonsoft.Json的GitHub地址在此 ,里面可以查看文档,教程等等。

可以到我的资源里面下载,里面附带源码和unitypackage:https://download.csdn.net/download/egostudio/12594735

如何下载源代码?

  • 打开包管理器用户界面 Window > Package Manager
  • Unity Json序列化高级用法介绍_第1张图片
  • 然后按jillejr.newtonsoft.json-for-unity 包装上的更新按钮
  • Unity Json序列化高级用法介绍_第2张图片

最简单的用法,比如下面的代码,相信大家很容易掌握吧。

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);
	}
}
  • 序列化自定义Key的Dictionary(直接设置读回来会报错)
//对变量设置自定义转换类
[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

 

你可能感兴趣的:(unity3d,Unity拓展)