如何解析与反序列化JSON响应?JSON.NET反序列化失败求助
解析嵌套JSON字符串的JSON响应
问题本质
我之前也碰到过类似的情况,这其实是JSON结构的小陷阱:你的JSON里每个对象的value字段不是直接的嵌套JSON对象,而是一个被转义过的JSON字符串(里面的双引号都用\做了转义处理)。虽然JSON验证器判定它合法(这种转义写法完全符合JSON规范),但JSON.NET默认只会把value解析成普通的string类型,不会自动帮你把这个字符串再转成目标对象——这就是你觉得“反序列化器无法识别”的核心原因。
解决方案:分两步解析
我们可以通过两次反序列化来处理这个结构:先解析外层的数组结构,再把每个value字符串单独转成对应的对象。
1. 定义对应的实体类
首先要定义两个类,分别对应外层数组的元素,以及value字段里的JSON内容:
// 对应外层JSON数组的每个元素 public class DayEntry { [JsonProperty("value")] public string Value { get; set; } [JsonProperty("nr")] public int Nr { get; set; } } // 对应value字段里的JSON对象 public class DayDetails { [JsonProperty("code")] public string Code { get; set; } [JsonProperty("description")] public string Description { get; set; } [JsonProperty("isSet")] public bool IsSet { get; set; } }
2. 执行两次反序列化操作
先把整个JSON数组转成List<DayEntry>,再遍历每个元素,把Value字段单独解析成DayDetails对象:
// 你的原始JSON字符串(实际代码里可以用@逐字字符串避免转义麻烦) string rawJson = @"[ {""value"":""{\""code\"":\""MO\"",\""description\"":\""Monday\"",\""isSet\"":false}"",""nr"":1}, {""value"":""{\""code\"":\""TU\"",\""description\"":\""Tuesday\"",\""isSet\"":true}"",""nr"":2} ]"; // 第一步:解析外层的数组结构 var dayEntries = JsonConvert.DeserializeObject<List<DayEntry>>(rawJson); // 第二步:解析每个value字段,组合成最终的目标列表 var finalDayList = dayEntries.Select(entry => new { Details = JsonConvert.DeserializeObject<DayDetails>(entry.Value), entry.Nr }).ToList(); // 测试输出验证结果 foreach (var item in finalDayList) { Console.WriteLine($"序号:{item.Nr},代码:{item.Details.Code},星期:{item.Details.Description}"); }
额外优化建议
如果有机会控制这个JSON的生成方,最好让value直接输出嵌套的JSON对象(去掉外层的引号和转义),这样就能一步完成反序列化,不用二次解析。比如理想的JSON结构应该是这样:
[
{"value":{"code":"MO","description":"Monday","isSet":false},"nr":1},
{"value":{"code":"TU","description":"Tuesday","isSet":true},"nr":2}
]
这种情况下,你只需要把DayEntry类里的Value类型改成DayDetails,就能直接反序列化得到想要的结果了。
内容的提问来源于stack exchange,提问作者Tys
相关产品推荐
相关产品推荐

