使用Newtonsoft JSON.NET反序列化被两次序列化的对象问题
解决Newtonsoft JSON.NET反序列化失败的问题
咱们来拆解下你遇到的这个问题——你提供的这段JSON确实存在序列化错误,这正是导致你无法直接反序列化为具体类型的核心原因。
问题定位
你看这段JSON里的D16字段:它的值是一个被双引号包裹、内部引号用\转义的字符串化JSON片段,而不是直接的嵌套JSON对象。正常情况下,如果D16对应一个包含OptionsList的实体,它应该直接是{ "OptionsList": [...], ... }的结构,而非被字符串包裹的形式。这种错误会让JSON.NET无法识别其对应的对象类型。
另外还要注意:你提供的JSON末尾有null...截断标记,实际反序列化时必须确保JSON是完整的,否则也会失败。
解决方法一:修复源JSON(推荐)
如果能控制生成这段JSON的源头,直接修正结构,把D16值的外层双引号和转义符去掉,让它成为合法的嵌套对象。修复后的JSON如下:
{ "D16": { "OptionsList": [ { "Id": 0, "Value": "Yes", "IsHighlighted": false, "Color": "", "FieldsToProcess": [] }, { "Id": 1, "Value": "No", "IsHighlighted": false, "Color": "", "FieldsToProcess": [] } ], "SingleSelectedOption": null } }
之后定义对应实体类,就能直接反序列化:
public class Option { public int Id { get; set; } public string Value { get; set; } public bool IsHighlighted { get; set; } public string Color { get; set; } public List<string> FieldsToProcess { get; set; } } public class D16Content { public List<Option> OptionsList { get; set; } public object SingleSelectedOption { get; set; } // 可根据实际类型替换为具体类 } public class RootObject { public D16Content D16 { get; set; } } // 反序列化代码 var fixedJson = "修复后的完整JSON字符串"; var result = JsonConvert.DeserializeObject<RootObject>(fixedJson);
解决方法二:无法修改源JSON时的临时方案
如果没办法调整源JSON,我们可以分两步反序列化:
- 先把整个JSON反序列化为临时类,接收
D16的字符串值; - 再单独把
D16的字符串内容反序列化为目标实体类。
代码示例:
// 临时类,用于接收原始JSON结构 public class TempRoot { public string D16 { get; set; } } // 目标实体类和方法一中的Option、D16Content一致 // 第一步:反序列化到临时类 var originalJson = "你提供的原始JSON字符串"; var tempResult = JsonConvert.DeserializeObject<TempRoot>(originalJson); // 第二步:把D16的字符串内容反序列化为目标类型 var d16Content = JsonConvert.DeserializeObject<D16Content>(tempResult.D16);
这样就能绕过源JSON的序列化错误,成功得到你需要的对象了。
内容的提问来源于stack exchange,提问作者Kerim Emurla
相关产品推荐
相关产品推荐

