PropertyGrid的TypeConverter与Newtonsoft.Json冲突,序列化异常如何解决?
解决Newtonsoft.Json序列化带TypeConverter特性类的异常问题
问题场景
当MyClass标注了[TypeConverter(typeof(ExpandableObjectConverter))]特性用于PropertyGrid控件显示时,使用Newtonsoft.Json序列化Dictionary<string, MyClass>时,不会输出对象的实际字段数据,只会返回字符串"MyClass",无法正常序列化对象内容。
示例代码
using Newtonsoft.Json; using System.ComponentModel; // Serialize Dictionary<string, MyClass> d = new Dictionary<string, MyClass>(); MyClass obj = new MyClass { Id = 1, Name = "John Doe" }; d["A"] = obj; string json = JsonConvert.SerializeObject(d); Console.WriteLine(json); public class B { public int x { get; set; } } [TypeConverter(typeof(ExpandableObjectConverter))] public class MyClass { public int Id { get; set; } public string Name { get; set; } public B b { get; set; } = new B(); }
简便解决方案
方案一:序列化时配置忽略TypeConverter
在序列化时通过JsonSerializerSettings设置ContractResolver的IgnoreTypeConverter属性为true,强制Json.NET忽略类上的TypeConverter特性,按正常对象序列化:
var settings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { IgnoreTypeConverter = true } }; string json = JsonConvert.SerializeObject(d, settings);
方案二:在类上添加JsonConverter特性
直接在MyClass上标注[JsonConverter(typeof(JsonObjectConverter))],指定Json.NET按对象类型序列化,覆盖TypeConverter的影响:
[TypeConverter(typeof(ExpandableObjectConverter))] [JsonConverter(typeof(JsonObjectConverter))] public class MyClass { public int Id { get; set; } public string Name { get; set; } public B b { get; set; } = new B(); }
两种方案都能解决问题,方案一无需修改类定义,适合仅在特定序列化场景下忽略TypeConverter的情况;方案二则全局生效,适合所有序列化场景都需要正常序列化该类的情况。
内容的提问来源于stack exchange,提问作者kilasuelika
相关产品推荐
相关产品推荐

