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

本文关键字:JSON 无效 包含 何检测 检测 | 更新日期: 2023-09-27 18:17:04

是的,是的,我知道有无数关于检测无效Json的帖子。它们都在说同样的事情:尝试解析或反序列化对象。你猜怎么着?在本例中是Json。NET愉快地解析我的畸形JSON,并没有抱怨。我想我需要澄清一下:我的JSON中唯一的错误是数组中末尾的逗号。下面举例说明了我的问题:

string badJson = "{ 'array' : [ {'objName1' : 'value1'}, {'objName2' : 'value2'}, {'objName3' : 'value3'}, ] }";
var obj = JObject.Parse(badJson);

JSON在浏览器中无效,因为它在数组中有一个逗号,但它很高兴地被解析成一个job对象。既然我不能实际使用序列化来检测这个问题,我该如何做呢?

注意,我已经尝试序列化成一个对象,产生了相同的结果。

更新:

下面的代码将正确地检测逗号并删除它,以防有人需要这样做:

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。这比上面的正则表达式慢得多,所以我最终使用了正则表达式。

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

if Regex.IsMatch(badJson, "^.*,'s*]'s*}$") 
   throw new Exception("hey that's bad json");

您可以使用正则表达式去掉不合适的逗号。

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

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