我在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的建议吗?感谢。
答案 0 :(得分:2)
好的,它已经在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
版本。)
答案 1 :(得分:1)
我会非常坦率地立即宣布任何此类行为正是的内容: A BUG!
......那是一个非常严肃的人。
实际表现出这种行为的任何 JSON解析器都会被灾难性地破坏。"您应该,恕我直言,立即与该软件包的供应商一起打开故障单,并为其分配尽可能高的严重性。