JSON.NET でのオプションの配列とオブジェクトの逆シリアル化の処理
JSON.NET ライブラリを使用して Facebook から返されたデータを処理する場合、JSON 構造が変更される可能性があります。一部のプロパティは配列として表される場合もあれば、オブジェクトとして表される場合もあります。これにより、逆シリアル化の問題が発生する可能性があります。
質問
一部の Facebook 投稿は次の形式で JSON を返す場合があり、これにより逆シリアル化が失敗します:
<code class="language-json">"attachment": { "media":{}, "name":"", "caption":"", "description":"", "properties":{}, "icon":"http://www.facebook.com/images/icons/mobile_app.gif", "fb_object_type":"" }, "permalink":"http://www.facebook.com/1234"</code>
解決策
この問題を解決するには、JsonConverter
クラスを使用してカスタム JSON コンバーターを実装します。このコンバータは、特定のプロパティの配列とオブジェクト構造を処理します。
カスタム JSON コンバーター
次のカスタム コンバータ SingleValueArrayConverter
は、単一のオブジェクトをリストに変換し、プロパティを正しく逆シリアル化できるようにします:
<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { object retVal; if (reader.TokenType == JsonToken.StartObject) { T instance = (T)serializer.Deserialize(reader, typeof(T)); retVal = new List<T>() { instance }; } else if (reader.TokenType == JsonToken.StartArray) { retVal = serializer.Deserialize(reader, objectType); } else { retVal = null; // 处理其他情况,例如空值 } return retVal; } public override bool CanConvert(Type objectType) { return true; } }</code>
使用法
カスタムコンバータを使用するには、ターゲットクラスのプロパティにJsonConverter
属性の注釈を付けます:
<code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))] public List<OrderItem> Items { get; set; }</code>
これにより、JSON.NET が Items
プロパティの配列とオブジェクト構造を処理できるようになり、逆シリアル化の問題が解決されます。 get; set;
の追加と、より堅牢にするための else
ケースの処理に注意してください。
以上がJSON.NETでオプションの配列とオブジェクトを使用してJSONを逆シリアル化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。