2017-04-21 5 views
3

최근에 6.0.1에서 Json.NET 10.0r2로 업그레이드했습니다. 업그레이드 한 후 유효하지 않은 Json을 역 직렬화하려고 시도 할 때 단위 테스트 중 하나가 스택 오버플로 예외를 throw합니다. 이 테스트의 목적은 유효하지 않은 Json의 처리를 보장하는 것이 었습니다. 이 같은 테스트는 JsonSerializationException을 던지기 위해 사용되었지만 이제는 StackOverflow를 사용하여 nUnit을 종료합니다.JsonConvert.DeserializeXmlNode의 StackOverflowException

나는이 테스트에 Json.NET 자신의 단위 테스트 프로젝트를 복제 한 : 작업 주위에 작업에

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

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

어떤 아이디어?

감사합니다.

답변

1

업데이트는 변화

그리고 신속하게 fixed822c3f0을 설정합니다. 10.0.2 이후의 다음 릴리스에 있어야합니다.

그것은 버전 8.0.1에서 JsonTextReader의 변경과 같은

XmlNodeConverter에서 버그를 발견했을 수 있습니다 원래 대답. 파일의 예상치 못한 끝에 도달 7.0.1에서는

, JsonReader.TokenTypeUnexpected JsonToken when deserializing node: None 예외를 던져 DeserializeNode() 원인 Read()에 다음 시도, 후 JsonToken.None된다. 그러나 8.0.1 이상에서 TokenType은 마지막으로 발생한 토큰의 유형, 즉 JsonToken.PropertyName에서 멈추지 않는 것처럼 보이므로 무한 재귀가 발생합니다.

올바른 수정 reader.Read()의 반환 확인, 라인 2171 주위에 XmlNodeConverter.DeserializeNode()에, 다음과 같습니다

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.

  • 사전 분석 JToken에 JSON을 :

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