首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackOverflowException in JsonConvert.DeserializeXmlNode

StackOverflowException in JsonConvert.DeserializeXmlNode
EN

Stack Overflow用户
提问于 2017-04-21 21:10:41
回答 1查看 335关注 0票数 3

我们最近从6.0.1升级到了Json.NET 10.0r2,自从升级之后,我注意到我们的一个单元测试在试图反序列化无效的Json时抛出一个堆栈溢出异常。测试的目的是确保处理无效的Json。这个测试曾经抛出一个JsonSerializationException,但现在正在用StackOverflow降低nUnit。

我在Json.NET自己的单元测试项目中复制了这个测试:

代码语言:javascript
复制
[Test]
public void FailOnInvalidJSON( )
{
    string json = @"{'Row' : ";

    Assert.Throws<JsonSerializationException>(()=>JsonConvert.DeserializeXmlNode(json, "ROOT"));
}

对工作有什么想法吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()的返回。

代码语言:javascript
复制
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行中。

如果你想的话,你可以报告问题

在此期间,您的解决办法是:

  • 以不同的方式损坏JSON,例如: 字符串json =@{‘Row’:}"; 并检查更常见的异常JsonException
  • 将JSON预解析为JToken: Assert.Throws(()=>JsonConvert.DeserializeXmlNode(JToken.Parse(json).ToString(),“根”);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43552070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档