2017-12-13 16 views
0

불완전한 JSON 페이로드가 있습니다 (예 : 중간 전송에 실패한 HTTP 연결). 다운로드 한 부분은 유효하지만 다운로드는 언제든지 중단 될 수 있습니다.Json.net - 불완전한 JSON을 "고치는 방법"?

Json.NET을 사용하면 나머지 JSON 페이로드를 어떻게 추정 할 수 있습니까?
.
.
.
좋아, 농담이야.

내가 정말로 원하는 것은 (JSON.NET을 사용하여) 유효한 JSON을 가능한 한 많이 가지고있는 청크를 변환하는 것이다.

Json 페이로드 형식은 선험적으로 알 수 없습니다. 여기

깨진 JSON
의 예 - 읽기 당신의 단계를보고, 그것은 갑자기 종료 : 나는 Json.NET 낮은 수준을 받으

var broken = @"[ 
    {'key':'value'}, 
    {'Tables': [ 
     { 
      'TableName': 'Table_0', 
      'Columns': [ 
       { 
        'ColumnName': 'Enabled', 
        'DataType': 'String', 
       } 
      ], 
      'Rows': [ 
       [ 
        'False', 
        'getuser' 
"; 
+0

내가 Json.net에 익숙하지 않은 해요,하지만 귀하의 질문은 예상되는 JSON 구조를 알고 있는지 여부에 따라 달라집니다. 'Tables'객체가 어떻게 보이는지 알면 직렬/파서와 같은 것으로 전달하고 나머지는 기본적으로 남겨 둘 수 있습니다. – Pitt

+0

질문이 업데이트되었습니다. 형식은 무엇이든 될 수 있습니다. –

+0

[잘못된 json을 어떻게 직렬화 할 수 있습니까? 잘린 개체 목록] (https://stackoverflow.com/q/36576928/3744182). – dbc

답변

1

, 나는 스트림을 사용하게 독자/작가.

JsonTextWriter의 마법 속성은 AutoCompleteOnClose입니다.이 속성은 작성자가 닫힐 때 '보류 중'인 '토큰 토큰'을 추가하는 트릭입니다.

var broken = @"[ 
    {'key':'value'}, 
    {'Tables': [ 
     { 
      'TableName': 'Table_0', 
      'Columns': [ 
       { 
        'ColumnName': 'Enabled', 
        'DataType': 'String', 
       } 
      ], 
      'Rows': [ 
       [ 
        'False', 
        'getuser', 
        {'fdsa': 
"; 

using (var sw = new StringWriter()) 
{ 
    var wr = new JsonTextWriter(sw) 
    { 
     AutoCompleteOnClose = true, //simple - just ask the writer to fill in any missing closing tokens 
     Formatting = Newtonsoft.Json.Formatting.Indented 
    }; 
    using (wr) 
    { 
     using (var rdr = new JsonTextReader(new StringReader(broken)) { CloseInput = true }) 
     { 
      try 
      { 
       wr.WriteToken(rdr); 
      } 
      catch { /* swallow the read error and keep on trucking */ } 
     } 
    } //json writer is closed now 
    Console.WriteLine(sw.ToString()); 
} 

은 산출의 출력입니다 :

[ 
    { 
    "key": "value" 
    }, 
    { 
    "Tables": [ 
     { 
     "TableName": "Table_0", 
     "Columns": [ 
      { 
      "ColumnName": "Enabled", 
      "DataType": "String" 
      } 
     ], 
     "Rows": [ 

      [ 
      "False", 
      "getuser", 
      { 
       "fdsa": null 
      } 
      ] 
     ] 
     } 
    ] 
    } 
]