.NET Core3.1升级.NET6后Newtonsoft.Json报错及迁移咨询
报错原因
这个报错和.NET Core 3.1升级到.NET 6、Newtonsoft.Json版本兼容性没有关系,是两个明确的代码/数据问题导致的:
- 传入的JSON数据本身格式非法:你贴的
myQueueItem中,input字段嵌套的JSON字符串第一个片段是\"06-24T07-05-35Z48\",,只有属性名/值片段,没有按JSON语法要求跟:和对应的属性值,直接接了逗号分隔下一个属性,解析器读到这个位置时预期匹配冒号,实际拿到逗号,直接抛出对应错误。 - 反序列化的目标类型和输入结构不匹配:你直接把整个
myQueueItem反序列化为OrderRequest,但myQueueItem的根结构是带input字段的外层对象,和仅定义了RunId属性的OrderRequest结构完全不匹配,就算JSON格式合法,也无法正确映射字段。
修复步骤
- 先修正上游生成JSON的逻辑,补全
input字段内非法的JSON片段。如果06-24T07-05-35Z48是RunId的属性值,修正后的合法input内容应该为:
"{\"RunId\":\"06-24T07-05-35Z48\",\"IsSuccess\":true,\"Message\":\"Completed Successfully\"}"
- 调整反序列化逻辑,分层解析结构,不要直接把外层队列消息反序列化为内层业务对象,参考实现:
// 先解析外层队列消息结构,提取input字段的内容 var queueRoot = JsonConvert.DeserializeObject<JObject>(myQueueItem); var inputContent = queueRoot.Value<string>("input"); // 再将内层JSON字符串反序列化为目标业务对象 var message = JsonConvert.DeserializeObject<OrderRequest>(inputContent);
- 如果业务逻辑需要读取
IsSuccess、Message字段,记得给OrderRequest类补充对应的属性定义,否则这两个字段的值会在反序列化时被默认忽略。
关于迁移System.Text.Json的建议
这个场景下迁移到System.Text.Json不会解决现有报错——报错的核心原因是输入JSON格式非法、反序列化逻辑和结构不匹配,任何合规的JSON解析器遇到非法格式的JSON都会抛出错误,不存在换库就能正常解析的情况。
是否迁移可以根据项目实际情况选择:
- 如果项目没有依赖Newtonsoft.Json的特有能力(比如自定义契约解析器、动态类型序列化、JToken灵活操作等),可以迁移到System.Text.Json,该库是.NET 6+内置组件,性能表现更优,不需要额外引入第三方依赖。
- 如果现有项目已经大量使用Newtonsoft.Json的专属特性,不需要为了这个报错强行迁移,Newtonsoft.Json在.NET 6及以上版本可以稳定运行,只要修正数据和反序列化逻辑即可。
内容的提问来源于stack exchange,提问作者Bozhinovski
相关产品推荐
相关产品推荐

