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

时间:2014-08-08 18:13:54

标签: c# json

是的,是的,我知道有无数关于检测无效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。这比上面的正则表达式慢得多,所以我最终使用了正则表达式。

2 个答案:

答案 0 :(得分:0)

你可以用正则表达式删除有问题的逗号。

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

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

答案 1 :(得分:0)

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