gpt4 book ai didi

json - JsonConvert.DeserializeXmlNode 中的 StackOverflowException

转载 作者:行者123 更新时间:2023-12-01 05:45:28 25 4
gpt4 key购买 nike

我们最近从 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"));
}

有什么变通办法吗?

谢谢!

最佳答案

更新

并迅速fixed在变更集中822c3f0 .应该在 10.0.2 之后的下一个版本中。

原始答案

它看起来像是对 JsonTextReader 的更改在 8.0.1 版中可能发现了 XmlNodeConverter 中的错误.

7.0.1 ,当到达意外的文件末尾时,JsonReader.TokenType在下一次尝试 Read() 后变为 JsonToken.None ,这导致 DeserializeNode()在反序列化节点时抛出 Unexpected JsonToken: None 异常。但是在8.0.1之后 TokenType 似乎停留在最后遇到的 token 的类型,即 JsonToken.PropertyName,这会导致无限递归。

正确的修复是在 XmlNodeConverter.DeserializeNode() 中在第 2171 行附近,检查 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)line 1942 .

你可以 report an issue如果你愿意的话。

与此同时,您可以选择的解决方法是:

  • 以不同的方式破坏 JSON,例如:

    string json = @"{'Row' : }";

    并检查更一般的异常JsonException

  • 将 JSON 预解析为 JToken:

    Assert.Throws<JsonException>(()=>JsonConvert.DeserializeXmlNode(JToken.Parse(json).ToString(), "ROOT"));

关于json - JsonConvert.DeserializeXmlNode 中的 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com