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

C#中反序列化含动态键的JSON字符串问题求助

问题分析与修正方案

核心错误点

  • 反序列化类型不匹配:原JSON是一个完整的Data对象,而非Dictionary<string, Data>,直接用字典反序列化会导致结构完全不匹配。
  • 动态键的实体类定义错误:
    • Field类:JSON中每个fields元素是单动态键对应Tag对象的结构,而非包含List<Tag>的嵌套类。
    • subField类:JSON中每个subfields元素是单动态键对应字符串值的结构,不需要多层嵌套的类结构。
  • 成员访问性问题:原Field类中的Tags是私有成员,无法被Json.NET识别并完成反序列化。
  • 大小写映射问题:C#类中的Results属性与JSON的results键大小写不一致,虽然后者默认兼容,但显式指定映射能避免潜在问题。

修正后的实体类定义

[DataContract]
public class Data
{
    [DataMember]
    public Status status { get; set; }
    [DataMember]
    public int total { get; set; }
    // 显式指定JSON键名,消除大小写歧义
    [DataMember(Name = "results")]
    public List<Result> Results { get; set; }
}

[DataContract]
public class Status
{
    [DataMember]
    public string code { get; set; }
    [DataMember]
    public string message { get; set; }
}

[DataContract]
public class Result
{
    [DataMember]
    public string leader { get; set; }
    // 用Dictionary适配fields中的动态键(如"020"、"041")
    [DataMember]
    public List<Dictionary<string, Tag>> fields { get; set; }
}

[DataContract]
public class Tag
{
    [DataMember]
    public string ind1 { get; set; }
    [DataMember]
    public string ind2 { get; set; }
    // 用Dictionary适配subfields中的动态键(如"a"、"c")
    [DataMember]
    public List<Dictionary<string, string>> subfields { get; set; }
}

正确的反序列化代码

string strJson = f["dataJson"].ToString();
var deserializedData = JsonConvert.DeserializeObject<Data>(strJson);

补充说明

对于JSON中的动态键结构,使用Dictionary<string, T>是最直接的适配方案,能完美匹配动态键值对的结构。如果需要将subfields的键值对转为更易用的实体(比如包含Key和Value的类),可以在反序列化后手动转换,或者自定义Json转换器,但简单场景下直接用Dictionary<string, string>足够高效。

内容的提问来源于stack exchange,提问作者Krystal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 01:03:20