C#反序列化含动态类名的复杂JSON对象问题
解决动态属性名的JSON反序列化问题
你遇到的核心问题是Products类的字典属性既私有又未配置序列化扩展,导致序列化器无法识别动态键值对。以下是两种可行的解决方案:
方案一:直接替换为字典类型(最简洁)
删掉多余的Products类,直接把Threads类里的products字段定义为Dictionary<string, DR7614060>,序列化器能直接将动态键值对映射到字典中:
public class Threads { public object threads { get; set; } public object error { get; set; } public Async async { get; set; } // 直接用字典接收动态属性 public Dictionary<string, DR7614060> products { get; set; } } public class DR7614060 { public string id { get; set; } public string threadId { get; set; } public string productId { get; set; } public bool mainColor { get; set; } public Productrollup productRollup { get; set; } } // 补充Async和Productrollup类(需与JSON实际结构匹配) public class Async { // 按JSON字段定义对应属性 } public class Productrollup { // 按JSON字段定义对应属性 }
方案二:保留Products类并配置扩展数据
如果必须保留Products类,需要将字典设为public,并添加序列化扩展特性,让序列化器自动收集动态属性:
若使用Newtonsoft.Json(Json.NET):
public class Threads { public object threads { get; set; } public object error { get; set; } public Async async { get; set; } public Products products { get; set; } } public class Products { // 添加特性,收集所有未匹配的动态属性 [Newtonsoft.Json.JsonExtensionData] public Dictionary<string, DR7614060> Pairs { get; set; } } public class DR7614060 { public string id { get; set; } public string threadId { get; set; } public string productId { get; set; } public bool mainColor { get; set; } public Productrollup productRollup { get; set; } }
若使用System.Text.Json:
public class Threads { public object threads { get; set; } public object error { get; set; } public Async async { get; set; } public Products products { get; set; } } public class Products { // 添加特性,先以JsonElement接收再转换 [System.Text.Json.Serialization.JsonExtensionData] public Dictionary<string, JsonElement> Pairs { get; set; } // 手动转换为目标类型 public Dictionary<string, DR7614060> GetProducts() { return Pairs.ToDictionary( kv => kv.Key, kv => System.Text.Json.JsonSerializer.Deserialize<DR7614060>(kv.Value) ); } } public class DR7614060 { public string id { get; set; } public string threadId { get; set; } public string productId { get; set; } public bool mainColor { get; set; } public Productrollup productRollup { get; set; } }
关键说明
- 原代码失败原因:
Pairs属性是私有(无public修饰),序列化器无法访问;且未配置扩展数据特性,序列化器不知道要把动态属性映射到字典。 - 务必保证Async和Productrollup类的属性与JSON实际结构完全匹配,否则这部分也会反序列化失败。
内容的提问来源于stack exchange,提问作者Moatasem La Kremed
相关产品推荐
相关产品推荐

