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
版本。)
我在 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
版本。)