我们最近从6.0.1升级到了Json.NET 10.0r2,自从升级之后,我注意到我们的一个单元测试在试图反序列化无效的Json时抛出一个堆栈溢出异常。测试的目的是确保处理无效的Json。这个测试曾经抛出一个JsonSerializationException,但现在正在用StackOverflow降低nUnit。
我在Json.NET自己的单元测试项目中复制了这个测试:
[Test]
public void FailOnInvalidJSON( )
{
string json = @"{'Row' : ";
Assert.Throws<JsonSerializationException>(()=>JsonConvert.DeserializeXmlNode(json, "ROOT"));
}对工作有什么想法吗?
谢谢!
发布于 2017-04-21 21:50:07
更新
并及时将固定设置为822c3f0。应该在10.0.2之后的下一个版本中。
原始答案
看起来,8.0.1版中对JsonTextReader的更改可能发现了XmlNodeConverter中的一个漏洞。
在7.0.1中,当到达文件的意外结束时,JsonReader.TokenType在下一次尝试Read()后变为JsonToken.None,这将导致DeserializeNode()抛出Unexpected JsonToken when deserializing node: None异常。但是在8.0.1和以后的8.0.1中,TokenType似乎停留在上次遇到的令牌的类型上,即JsonToken.PropertyName,这会导致无限递归。
在第2171行的XmlNodeConverter.DeserializeNode()中,正确的修复方法是检查reader.Read()的返回。
case JsonToken.PropertyName:
if (currentNode.NodeType == XmlNodeType.Document && document.DocumentElement != null)
{
throw JsonSerializationException.Create(reader, "JSON root object has multiple properties. The root object must have a single property in order to create a valid XML document. Consider specifying a DeserializeRootElementName.");
}
string propertyName = reader.Value.ToString();
// Need to check the return from reader.Read() here:
if (!reader.Read())
{
throw JsonSerializationException.Create(reader, "Unexpected end of file when deserializing property: " + propertyName );
}..。而且在XmlNodeConverter.cs中似乎还有几个地方需要检查来自reader.Read()的返回,例如在ReadAttributeElements(JsonReader reader, XmlNamespaceManager manager)中的第1942行中。
如果你想的话,你可以报告问题。
在此期间,您的解决办法是:
JsonException。JToken:
Assert.Throws(()=>JsonConvert.DeserializeXmlNode(JToken.Parse(json).ToString(),“根”);https://stackoverflow.com/questions/43552070
复制相似问题