我正在3.5 cf设置中使用json.net,并且有问题验证字符串确实是完整的JSON。
我正在使用:
var o = JObject.Parse(incomingString);
如果JSON不完整,它将返回null - 但并非总是如此。如果JSON是"大部分形成"的东西,它将正确解析。这个简单的示例返回一个对象:
{ "Name":"Bob", "Pets":[ {"Type":"Cat", "Name":"Pudge"
但是,如果我在其他地方将JSON打破,它将按预期返回零。
{ "Name":"Bob", "Pets":[ {"Type":"Cat", "Nam
如果没有闭合括号,它似乎"假设"那些括号并返回适当的职位,但是由于此JSON数据正在流中流,因此我需要在处理之前验证所有括号是否匹配了所有括号。
在我们有限的沙箱中,我似乎没有任何较新的API上可用的验证方法。是否有任何建议在处理之前验证我有整个JSON吗?谢谢。
好吧,它已固定在json.net 4.0.1中:固定的jtoken负载和解析方法未检查不完整的内容,但是您的''''在35r8上,因为那是支持的最后一个支持的版本紧凑型框架。在这种情况下,以下静态辅助方法将检查开始和终点的深度是否匹配:
public static class Json35Extensions
{
public static JObject ParseObject(string json)
{
using (var reader = new JsonTextReader(new StringReader(json)))
{
var startDepth = reader.Depth;
var obj = JObject.Load(reader);
if (startDepth != reader.Depth)
throw new JsonSerializationException("unclosed json found");
return obj;
}
}
public static JArray ParseArray(string json)
{
using (var reader = new JsonTextReader(new StringReader(json)))
{
var startDepth = reader.Depth;
var obj = JArray.Load(reader);
if (startDepth != reader.Depth)
throw new JsonSerializationException("unclosed json found");
return obj;
}
}
}
使用json.net 3.5.8,对于两个测试JSON字符串,都会抛出例外,但是如果我手动修复您的JSON,则没有例外。(注意 - 我测试了ParseObject
版本,但尚未测试ParseArray
版本。)
我会非常轻率地声明任何此类行为,确切地将其是: a bug!
...这是一个非常严肃的。
实际上表现出这种行为的任何 json-parser都是"灾难性的"。您应该,IMHO,,立即使用该软件包的供应商打开故障票,并将其分配为最高的严重性。