1、JSON实体类
class Animal { public string Name { get; set; } public int Age { get; set; } } class BaseObj { public Animal Animal { get; set; } } class People : BaseObj { public DateTime StudentTime { get; set; } } class Dog : BaseObj { public DateTime EatTime { get; set; } }
2、自定义JsonConverter(转换器)
1)自定义JsonConverter
class ObjConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(BaseObj).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject obj = JObject.Load(reader); string type = (string)obj["$type"]; BaseObj baseObj; if (type.Contains(nameof(People))) { baseObj = new People(); } else { baseObj = new Dog(); } serializer.Populate(obj.CreateReader(), baseObj); if (baseObj.Animal == null) { baseObj.Animal = new Animal { Name = (string)obj["ObjName"], Age = (int)obj["ObjAge"] }; } return baseObj; } public override bool CanWrite => false; public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }
2)反序列化
var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Converters = new List { new ObjConverter() } }; var baseObj = JsonConvert.DeserializeObject(json, settings);
3) 完整代码
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication { class Program { static ReaderWriterLock rwl = new ReaderWriterLock(); // 定义ReaderWriterLock对象。 static int resource = 0; const int numThreads = 8; static bool running = true; static int readerTimeouts = 0; static int writerTimeouts = 0; static int reads = 0; static int writes = 0; public static void Main() { var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, Converters = new List { new ObjConverter() } }; var setting = new Newtonsoft.Json.JsonSerializerSettings { TypeNameAssemblyFormatHandling = Newtonsoft.Json.TypeNameAssemblyFormatHandling.Simple, TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects, }; string json = JsonConvert.SerializeObject(new Dog { Animal = new Animal { Age = 1, Name = "dog" }, EatTime = DateTime.Now }, setting); Console.WriteLine("json = " + json); //json = {"$type":"ConsoleApplication.Dog, ConsoleApp3","EatTime":"2022-02-25T11:0 //4:07.6480015 + 08:00","Animal":{"$type":"ConsoleApplication.Animal, ConsoleApp3"," //Name":"dog","Age":1}} var baseObj = JsonConvert.DeserializeObject(json, settings); Console.ReadKey(); } } class Animal { public string Name { get; set; } public int Age { get; set; } } class BaseObj { public Animal Animal { get; set; } } class People : BaseObj { public DateTime StudentTime { get; set; } } class Dog : BaseObj { public DateTime EatTime { get; set; } } class ObjConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(BaseObj).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject obj = JObject.Load(reader); string type = (string)obj["$type"]; BaseObj baseObj; if (type.Contains(nameof(People))) { baseObj = new People(); } else { baseObj = new Dog(); } serializer.Populate(obj.CreateReader(), baseObj); if (baseObj.Animal == null) { baseObj.Animal = new Animal { Name = (string)obj["ObjName"], Age = (int)obj["ObjAge"] }; } return baseObj; } public override bool CanWrite => false; public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } }