2017-04-21 34 views
3

我們最近從6.0.1升級到了Json.NET 10.0r2,自升級以來,我注意到我們的一個單元測試在試圖反序列化無效Json時拋出了Stack Overflow Exception。測試的目的是確保處理無效的Json。這個測試用於拋出JsonSerializationException,但現在正在使用StackOverflow降低nUnit。JsonConvert.DeserializeXmlNode中的StackOverflowException

我這個試驗複製它在Json.NET自己的單元測試項目:

[Test] 
public void FailOnInvalidJSON() 
{ 
    string json = @"{'Row' : "; 

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

工作一個變通的任何想法?

謝謝!

回答

1

更新

並及時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.csreader.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")); 
    
相關問題