2016-04-12 7 views
2

私のjsonファイルは主にオブジェクトを含む配列ですが、リストが不完全なので最後のエントリは使用できません。最後の無効なエントリを破棄しながら、私はNewtonsoft.Jsonライブラリを使用しての方法があるかどうかを教え、または私はいくつかの前処理を必要とするようにしてください無効なjsonをどのように逆シリアル化できますか?オブジェクトの切り捨てリスト

[ { "key" : "value1" }, { "key " : "value2"}, { "key 

ファイルの残りの部分をデシリアライズしたいと思います。

ありがとうございました!

+0

JSONはHTMLではないため、無効なデータの回避策を実装するライブラリを増やす理由はありません。あなたはおそらくJSONを処理するためにコンピュータ言語を使用しています。そのようなlang(C#?)からの文字列操作関数を使って前処理を実装するのは難しいことではありません。 –

答えて

2

あなたはJsonReaderクラスを使用することができます。以下のコードのようなものは、取得したプロパティを解析して例外をスローします。もちろん、これをデシリアライズして具体的なクラスにする必要がある場合もあります。

public Partial FromJson(JsonReader reader) 
{ 
    while (reader.Read()) 
    { 
     // Break on EndObject 
     if (reader.TokenType == JsonToken.EndObject) 
      break; 

     // Only look for properties 
     if (reader.TokenType != JsonToken.PropertyName) 
      continue; 

     switch ((string) reader.Value) 
     { 
      case "Id": 
       reader.Read(); 
       Id = Convert.ToInt16(reader.Value); 
       break; 

      case "Name": 
       reader.Read(); 
       Name = Convert.ToString(reader.Value); 
       break; 

     } 
    } 

    return this; 
} 

コードはCGbR JSON Targetから取得しました。

1

Json.NETにあなたがJTokenWriterJsonTextReaderから、あなたの文字列をストリームと切り捨てJSONを解析する場合にスローされますJsonReaderExceptionをキャッチし、嚥下によって部分的な結果を得ることができます8.0.3のようになります。

JToken root; 
string exceptionPath = null; 
using (var textReader = new StringReader(badJson)) 
using (var jsonReader = new JsonTextReader(textReader)) 
using (JTokenWriter jsonWriter = new JTokenWriter()) 
{ 
    try 
    { 
     jsonWriter.WriteToken(jsonReader); 
    } 
    catch (JsonReaderException ex) 
    { 
     exceptionPath = ex.Path; 
     Debug.WriteLine(ex); 
    } 
    root = jsonWriter.Token; 
} 

Console.WriteLine(root); 
if (exceptionPath != null) 
{ 
    Console.WriteLine("Error occurred with token: "); 
    var badToken = root.SelectToken(exceptionPath); 
    Console.WriteLine(badToken); 
} 

これは、その結果:あなたは、その後で部分オブジェクトをデシリアライズ終えることができました

[ 
    { 
    "key": "value1" 
    }, 
    { 
    "key ": "value2" 
    }, 
    {} 
] 

JToken.ToObjectbadToken.Remove()を使用して、不完全な配列エントリを削除することもできます。

最初は無効なJSONを生成しないほうがよいでしょう。私はこれがJson.NETの文書化された機能であることも完全には分かっていないので、Json.NETの将来のバージョンでは動作しない可能性があります。 (例えば、Newtonsoftは、JTokenWriter.Tokenが書き込みが成功したときにのみ設定されるようにアルゴリズムを変更する可能性があります)。

関連する問題