我尝试使用code I found in this answer: -
strInput = strInput.Trim();
if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
(strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
{
try
{
var obj = JToken.Parse(strInput);
return true;
}
catch (JsonReaderException jex)
{
//Exception in parsing json
Console.WriteLine(jex.Message);
return false;
}
catch (Exception ex) //some other exception
{
Console.WriteLine(ex.ToString());
return false;
}
}
else
{
return false;
}
此代码的问题在于,它将错误的JSON文件验证为正确,因为JToken.Parse会自动删除序列中加倍的元素,例如:
{
"Body" : {
"Data" : {}
},
"Head" : {
"RequestArguments" : {
"Scope" : ""
},
"Status" : {
"Code" : 255,
"Reason" : "CGI-Args: Invalid parameter '' for Scope.",
"UserMessage" : ""
},
"Timestamp" : "2017-01-24T13:15:33+01:00"
},
"Head" : {
"RequestArguments" : {
"Scope" : ""
},
"Status" : {
"Code" : 255,
"Reason" : "CGI-Args: Invalid parameter '' for Scope.",
"UserMessage" : ""
},
"Timestamp" : "2017-01-24T13:15:33+01:00"
}
}
这里有2个不允许的同一级别的头部令牌,但是JToken会自动解析2个头部令牌中的一个,因此生成的对象有效
答案 0 :(得分:-1)
您可以修改此代码以检查JToken.Parse()结果中的元素。如果值重复,则可以返回false