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

JSON.net CF 3.5, verify that JSON is complete

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

我正在使用:

var o = JObject.Parse(incomingString);
如果 JSON 不完整,

将 return 为 null - 但并非总是如此。如果 JSON 是 "mostly formed",它将正确解析。这个简单的例子 return 是一个对象:

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

但如果我在别处打破 JSON,它 return 会像预期的那样为 null。

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

没有右括号似乎 "assume" 那些括号和 return 是一个正确的 JObject,但是由于此 JSON 数据正在流入,我需要验证所有括号是否匹配在我处理它之前。

在我们有限的沙盒中,我似乎没有任何适用于较新 API 的验证方法。在处理之前验证我是否拥有整个 JSON 有什么建议吗?谢谢。

我会非常坦率和非常直接地声明任何此类行为正是它是什么:一个BUG!

...而且非常严肃。

任何 JSON-实际上表现出这种行为的解析器是"catastrophically broken."你应该,恕我直言,立即向该软件包的供应商开具故障单,并为其分配尽可能高的严重性。

好的,它已在 Json.NET 4.0.1: Fixed 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 版本。)