2017-12-13 11 views
0

不完全なJSONペイロードがあります(中間転送に失敗したHTTP接続など)。ダウンロードされた部分は有効ですが、ダウンロードはいつでも中断できます。Json.net - 不完全なJSONを "修正する"方法

Json.NETを使用すると、残りのJSONペイロードをどのように推定できますか?



さて、ちょうど冗談です。

私が本当に望むのは、有効なJSONにできるだけ多くのチャンクを変換することです(Json.NETを使用しています)。

Jsonペイロードの形式は、事前に不明です。

ここで壊れたJSON
の例だ - 読むとき、それは突然終了し、あなたのステップを見て:

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

私はJson.NETで低レベルを取得する必要があるとき、私はストリームを使用して終了読者/ライター。

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 
      } 
      ] 
     ] 
     } 
    ] 
    } 
] 
関連する問題