如何检测包含带c#的尾随逗号的无效JSON?

如何检测包含带c#的尾随逗号的无效JSON?,c#,json,C#,Json,是的,是的,我知道有无数关于检测无效Json的帖子。它们都说了同样的话:尝试解析或反序列化对象。你猜怎么着?在这种情况下,Json.NET很高兴地解析了我的格式错误的Json,并且没有抱怨。我想我需要澄清:我的JSON唯一的错误是数组中的尾随逗号。以下说明了我的问题: string badJson = "{ 'array' : [ {'objName1' : 'value1'}, {'objName2' : 'value2'}, {'objName3' : 'value3'}, ] }"; v

是的,是的,我知道有无数关于检测无效Json的帖子。它们都说了同样的话:尝试解析或反序列化对象。你猜怎么着?在这种情况下,Json.NET很高兴地解析了我的格式错误的Json,并且没有抱怨。我想我需要澄清:我的JSON唯一的错误是数组中的尾随逗号。以下说明了我的问题:

string badJson = "{ 'array' : [ {'objName1' : 'value1'}, {'objName2' : 'value2'}, {'objName3' : 'value3'}, ] }";

var obj = JObject.Parse(badJson);
JSON在浏览器中是无效的,因为它在数组中有一个尾随逗号,但是它可以被解析为一个jobject。既然我不能实际使用序列化来检测这个问题,我该怎么做呢

请注意,我已经尝试序列化到一个对象中,得到了相同的结果

更新:

以下代码将正确检测逗号并将其去除,以防任何人需要执行此操作:

var regex = new Regex(@"(.*?),\s*(\}|\])",(RegexOptions.Multiline));

var cleanJson = regex.Replace(content, m => String.Format("{0} {1}",m.Groups[1].Value,m.Groups[2].Value));

另一种可能的解决方案是在对象模型中使用.NET Json解析器。另一个对我有效的解决方案是将对象解析为Jobject,然后再次序列化它。这让我可以在需要的地方使用Json。这比上面的正则表达式慢得多,所以我最终使用了正则表达式。

您可以用正则表达式去掉有问题的逗号

Regex.Replace(badJson, "}\s*,+\s*]", "} ]");

此模式将在右括号和右括号之间找到一个逗号,逗号周围有任意数量(0或更多)的空白字符。

不幸的是,这完全不可能。我正在处理的对象很大,非常复杂,并且反序列化为非常复杂的对象模式。但是序列的所有实例不是都不正确吗?所以最好能把它们都抓住,不是吗?我不明白对象模式的复杂性如何使regex.replace变得不合适……如果您只担心字符串末尾的逗号,可以使用
^.*.*.\s*]\s*}$
,所以它不需要更复杂,因为您的示例都不符合该模式。尽管如此,很高兴您找到了一个可行的解决方案。:)为什么不使用另一个json解析器来检测它呢
new JavaScriptSerializer().Deserialize(badJson)
@L.B您确定MS提供的库会检测到尾随的逗号吗?我可以试试这个。我所做的是反序列化,然后序列化相关数据,为我提供有效的json,我可以将其发送回浏览器。这是可行的,需要两行代码来修复。Nathan,但您的问题是检测无效的json。那是另一回事。@L.B FWIW,你的解决方案也有效,我刚刚试过。JavaScriptSerializer正确地检测到无效的JSON并给我一个异常。我不知道我要用哪一个,但是谢谢!我所做的是反序列化,然后序列化相关数据,为我提供有效的json,我可以将其发送回浏览器。这就解决了问题,需要两行代码来修复,而不是花一个小时来编写一个超级复杂的正则表达式,该正则表达式适用于所有情况,并且不会给出错误的肯定结果。我接受了你的答案,因为经过思考,我意识到你的解决方案可以解决问题,只需做以下修改:/.*,(:?\s*]|\s*})/我在回答中详细介绍的regex解决方案比反序列化然后序列化json要快得多,所以感谢您的建议,regex将投入生产。
if Regex.IsMatch(badJson, "^.*,\s*]\s*}$") 
   throw new Exception("hey that's bad json");