ホームページ >バックエンド開発 >C++ >JSON.NETでオプションの配列とオブジェクトを使用してJSONを逆シリアル化する方法は?

JSON.NETでオプションの配列とオブジェクトを使用してJSONを逆シリアル化する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-12 19:07:44276ブラウズ

How to Deserialize JSON with Optional Arrays and Objects in JSON.NET?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。