You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:38:16