更新
並及時fixed在改變設置822c3f0
。應該在10.0.2之後的下一個版本中。
原來的答案
它看起來像在8.0.1版本中改變JsonTextReader
可能XmlNodeConverter
已經發現的錯誤。
在7.0.1,到達文件的意外結束的時候,JsonReader.TokenType
下一次嘗試Read()
,這將導致DeserializeNode()
拋出Unexpected JsonToken when deserializing node: None
異常後變得JsonToken.None
。但是在8.0.1以後,TokenType
似乎停留在最後遇到的令牌的類型,即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"));
來源
2017-04-21 21:50:07
dbc