JSON.NET を使用した JSON オブジェクトのストリームの逆シリアル化
多くのシナリオでは、JSON データは分離されずに個別のオブジェクトのストリームとして提供されます。 。これは、JSON.NET を使用してそのようなデータを IEnumerable
初期アプローチとエラー
次のコマンドを使用してストリームを逆シリアル化しようとしていますコードによりエラーが発生します:
var serializer = new JsonSerializer(); serializer.CheckAdditionalContent = false; using (var reader = new StreamReader(stream)) using (var jsonReader = new JsonTextReader(reader)) { reader.SupportMultipleContent = true; reader.Read(); while (reader.TokenType != JsonToken.None) { yield return serializer.Deserialize<TResult>(reader); } }
エラーは予期せぬ終了を示しています1 つのオブジェクトを逆シリアル化した後のオブジェクトの数:
Newtonsoft.Json.JsonSerializationException: Unexpected token while deserializing object: EndObject. Path '', line 1, position 55.
解決策: 高度なリーダー処理
この問題を解決するには、成功するたびに JSON リーダーを手動で進める必要があります。逆シリアル化。修正されたループ構造は次のとおりです。
public IEnumerable<TResult> ReadJson<TResult>(Stream stream) { var serializer = new JsonSerializer(); using (var reader = new StreamReader(stream)) using (var jsonReader = new JsonTextReader(reader)) { jsonReader.SupportMultipleContent = true; while (jsonReader.Read()) { yield return serializer.Deserialize<TResult>(jsonReader); } } }
使用法と考慮事項
このメソッドを使用するには、JSON オブジェクトを含むオープン ストリームを提供します。結果として得られる IEnumerable
例:
using (var stream = /* some stream */) { IEnumerable<MyClass> result = ReadJson<MyClass>(stream); foreach (var item in result) { Console.WriteLine(item.MyProperty); } }
この例には、JSON.NET Web サイトのデモンストレーションと DotNet Fiddle の機能例へのリンクも含まれています。
以上がJSON.NET を使用して JSON オブジェクトのストリームを逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。