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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:35:48