ホームページ > バックエンド開発 > C++ > カスタム JsonConverter を使用して C# で混合 JSON 配列とオブジェクトを逆シリアル化するにはどうすればよいですか?

カスタム JsonConverter を使用して C# で混合 JSON 配列とオブジェクトを逆シリアル化するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-12 19:22:46
オリジナル
564 人が閲覧しました

How Can I Deserialize Mixed JSON Arrays and Objects in C# Using a Custom JsonConverter?

混合 JSON 配列とオブジェクトの C# 逆シリアル化

この記事では、データ構造が配列またはオブジェクトとして一貫性なく表示される可能性がある、Facebook などのソースからの JSON データを逆シリアル化するという課題について説明します。 このような状況では、標準の JSON.NET 逆シリアル化が失敗することがよくあります。

解決策: カスタム JsonConverter

この解決策には、カスタム JSON.NET コンバーターの作成が含まれます。 このコンバータは配列とオブジェクトの両方の形式を処理し、一貫した逆シリアル化を保証します。 (詳細な説明については、「カスタム JsonConverter を使用して不正な JSON 結果を修正する」を参照してください。)

カスタムコンバーターの実装

ソリューションの中核は、入力された JSON が単一のオブジェクトであっても、ターゲットの型のリストを返すカスタム コンバーターです。

  1. プロパティ属性:

    逆シリアル化されたデータを保持する C# クラスのプロパティには、カスタム コンバーターで注釈を付ける必要があります。

    <code class="language-csharp">[JsonConverter(typeof(SingleValueArrayConverter<OrderItem>))]
    public List<OrderItem> Items;</code>
    ログイン後にコピー
  2. SingleValueArrayConverter クラス:

    このカスタム コンバーターは JSON トークン タイプをチェックし、適切に逆シリアル化します。

    <code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter
    {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException(); // Not implemented for this example
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartObject)
            {
                T instance = (T)serializer.Deserialize(reader, typeof(T));
                return new List<T> { instance };
            }
            else if (reader.TokenType == JsonToken.StartArray)
            {
                return serializer.Deserialize(reader, objectType);
            }
            return null; // Handle other token types as needed
        }
    
        public override bool CanConvert(Type objectType)
        {
            return true; // Or add specific type checking here for robustness
        }
    }</code>
    ログイン後にコピー

このコンバーターは、JSON 入力が単一オブジェクトであっても配列であっても、結果として得られる C# プロパティには常に List<T> が含まれるようにします。 運用環境で使用するには、エラー処理 (予期しないトークン タイプなど) を追加する必要がある場合があることに注意してください。 このアプローチは、リストが単一オブジェクトと配列の JSON 入力の両方に適したデータ構造である場合に特に役立ちます。 リストが適切ではないシナリオでは、代替ソリューションが必要になる場合があります。

以上がカスタム JsonConverter を使用して C# で混合 JSON 配列とオブジェクトを逆シリアル化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート