JSON.net CF 3.5,验证JSON是否完整

时间:2015-05-07 15:28:11

标签: c# json json.net compact-framework

我在3.5 CF设置中使用Json.net,并且在验证字符串确实是完整的JSON时遇到问题。

我正在使用:

.appref-ms

如果JSON不完整则返回null - 但并非总是如此。如果JSON是"大多数形成",它将正确解析。这个简单的例子返回一个对象:

var o = JObject.Parse(incomingString);

但是如果我在别处打破JSON,它会按预期返回null。

{ "Name":"Bob", "Pets":[ {"Type":"Cat", "Name":"Pudge" 

没有右括号,似乎"假设"那些括号并​​返回一个合适的JObject,但由于这个JSON数据是流式传输,我需要在处理之前验证所有括号是否匹配。

在我们有限的沙箱中,我似乎没有新API上的任何验证方法。在我处理它之前有任何关于验证我有完整JSON的建议吗?感谢。

2 个答案:

答案 0 :(得分:2)

好的,它已经在Json.NET 4.0.1Fixed JToken Load and Parse methods not checking for incomplete content中得到修复,但你的问题仍然停留在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版本。)

答案 1 :(得分:1)

我会非常坦率地立即宣布任何此类行为正是的内容: A BUG!

......那是一个非常严肃的人。

实际表现出这种行为的任何 JSON解析器都会被灾难性地破坏。"您应该,恕我直言,立即与该软件包的供应商一起打开故障单,并为其分配尽可能高的严重性。