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
相关产品推荐
相关产品推荐

