ホームページ >バックエンド開発 >C++ >同じプロパティのシングル値と配列値が混在しているJSONデータを処理する方法は?

同じプロパティのシングル値と配列値が混在しているJSONデータを処理する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-02-02 21:06:09265ブラウズ

How to Handle JSON Data with Mixed Single and Array Values for the Same Property?

jsonデータ

質問:

JSONデータを処理する場合、同じ属性を単一の値として表現することも、値配列として表現することもできます。たとえば、sendgrid APIから取得した次の有効な負荷:

「カテゴリ」属性は、この問題を示しています。特定のプロジェクトでは、文字列であり、他のアイテムでは、文字列配列です。 JSON.NETは、この矛盾に対処するための2つの方法を提供します。送信されたデータを変更するか、json.netを構成して違いを受け入れます。

<code class="language-json">[
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "[email protected]",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]</code>
解決策:jsonconveter

推奨される方法は、カスタムJSonConverrerを使用することです。データを後付けするクラスを定義しましょう:

単一のアイテムまたは配列である可能性のある属性(この例「カテゴリ」)の場合、それをリスト

として定義し、そのレトロフィットを処理するためにカスタムコンバーターを指定します。

<code class="language-csharp">class Item
{
    [JsonProperty("email")]
    public string Email { get; set; }

    [JsonProperty("timestamp")]
    public int Timestamp { get; set; }

    [JsonProperty("event")]
    public string Event { get; set; }

    [JsonProperty("category")]
    [JsonConverter(typeof(SingleOrArrayConverter<string>))]
    public List<string> Categories { get; set; }
}</code>
以下は、コンバーターの実装です。

このコンバーターは、ラベルが配列に渡されるか、単一のアイテムにそれに応じて処理されるかどうかを決定します。それが配列である場合、それをリストに変換します。

使用法と出力

<code class="language-csharp">class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>();
        }
        if (token.Type == JTokenType.Null)
        {
            return null;
        }
        return new List<T> { token.ToObject<T>() };
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}</code>

カスタムコンバーターを使用するには、以下に示すようにデリバティブコードを更新してください:

プログラムは正しくシリアル化されたJSONデータになり、「カテゴリ」属性は、単一の状況と配列の状況のた​​めに適切に文字列リストに入力されます。 この方法は、同じプロパティでJSONデータを組み合わせて処理する柔軟な方法を提供します。

以上が同じプロパティのシングル値と配列値が混在しているJSONデータを処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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