使用NewtonSoft解析含NULL的JSON时遇NaN解析错误的解决求助
解决Newtonsoft.Json解析JSON时的"Error parsing NaN value"异常
这个问题我太熟了——你遇到的解析异常完全是因为返回的JSON不符合标准语法,跟你的C#请求/解析代码没关系!我们一步步拆解问题并解决:
问题根源:返回的JSON有3处语法错误
你拿到的JSON字符串存在以下不符合JSON规范的问题:
SUCCESS没有被双引号包裹:JSON里的字符串必须用双引号括起来,而"errmsg" : SUCCESS"里的SUCCESS是裸写的;- 大写的
NULL:JSON的空值必须是小写的null,大写NULL会被解析器识别为无效的标识符; - 多余的尾逗号:
"zzmmzw" : NULL, }里的逗号是多余的,JSON对象/数组的最后一项不能加逗号。
这些错误导致Newtonsoft.Json的解析器无法正确识别内容,抛出JsonReaderException。
解决方案
方案1:修复后端返回的标准JSON(推荐)
如果能控制API的输出(或者协调后端同学修改),直接把JSON修正为符合规范的格式:
{ "errcode" : "0", "errmsg" : "SUCCESS", "responseObject" :{ "result" :[{ "sjmj" : "ABCD", "zzmmzw" : null }], "total" : 39 } }
修改后,你原来的JsonConvert.DeserializeObject或JObject.Parse代码就能正常工作了。
方案2:在C#代码中修复不规范的JSON(临时 workaround)
如果无法修改后端返回,只能在前端先修正JSON字符串再解析。可以通过字符串替换或正则来处理:
// 获取retString之后,先修复语法问题 retString = retString // 给裸写的SUCCESS加上双引号 .Replace("SUCCESS", "\"SUCCESS\"") // 把大写NULL替换为标准的小写null .Replace("NULL", "null"); // 用正则移除对象/数组末尾的多余逗号(更通用) using System.Text.RegularExpressions; retString = Regex.Replace(retString, @",\s*([}\]])", "$1"); // 现在再解析就不会报错了 JObject jsonObj = JObject.Parse(retString); // 或者反序列化为自定义实体类 // var response = JsonConvert.DeserializeObject<YourCustomResponseClass>(retString);
注意:字符串替换是临时方案,若后端后续返回的JSON出现其他不规范写法(比如其他裸字符串、不同格式的尾逗号),可能需要调整替换逻辑。长期来看还是要推动后端输出标准JSON。
内容的提问来源于stack exchange,提问作者bb nn
相关产品推荐
相关产品推荐

