使用Newtonsoft.Json反序列化可变字段JSON时遇值为空问题
解决Newtonsoft.Json反序列化动态键值对为空的问题
问题原因
你的类结构中,Fix类的Values属性期望JSON数据里存在一个名为Values的嵌套对象,但实际返回的JSON中,fixes数组内的对象是直接包含fix1、fix2等动态键值对,没有Values这个层级,导致反序列化时无法匹配到Values属性,最终它为空。
解决方案
方法一:使用[JsonExtensionData]特性捕获动态键
修改Fix类,给IDictionary属性添加[JsonExtensionData]特性,Newtonsoft.Json会自动将对象中所有未匹配到其他属性的键值对存入该字典:
public class Update { public class Fix { [JsonExtensionData] public IDictionary<string, string> Values { get; set; } } public class Root { public string version { get; set; } public List<Fix> fixes { get; set; } } }
修改后,原反序列化代码无需改动,Values属性就能正确加载fix1、fix2等所有动态键值对,遍历逻辑可以正常获取值。
方法二:简化类结构(推荐)
如果Fix类没有其他额外属性,可以直接去掉该类,将根类中的fixes定义为List<IDictionary<string, string>>,结构更简洁:
public class UpdateRoot { public string version { get; set; } public List<IDictionary<string, string>> fixes { get; set; } }
对应的反序列化代码调整为:
var root = JsonConvert.DeserializeObject<UpdateRoot>(strContent); var fixes = root.fixes[0]; foreach (var fix in fixes) { string test = fix.Value.ToString(); }
验证
两种方法都能正确将JSON中的动态键值对加载到字典中,遍历过程可以正常获取每个fix对应的字符串值。
内容的提问来源于stack exchange,提问作者pretzel029455
相关产品推荐
相关产品推荐

