JSON.NET CF 3.5,验证JSON是否完成



我正在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,,立即使用该软件包的供应商打开故障票,并将其分配为最高的严重性。

相关内容

  • 没有找到相关文章

最新更新