ホームページ > バックエンド開発 > C++ > 同じプロパティの単一のアイテムまたはアレイのjson.netの降下を処理するにはどうすればよいですか?

同じプロパティの単一のアイテムまたはアレイのjson.netの降下を処理するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-02-02 20:46:12
オリジナル
434 人が閲覧しました

json.net

の同じ属性の単一プロジェクトまたは配列

この記事では、json.netを使用して、属性値によって返されるJSONデータを処理する方法について説明します。 sendgridイベントAPIを例にとると、そのcategories属性は単一の文字列または文字列配列である場合があります。

質問:

sendgridイベントAPIによって返されるJSONデータでは、

属性の形式は一貫性がない場合があります。 categories

例JSON:

<code class="language-json">[
  {
    "email": "test1@example.com",
    "timestamp": 1337966815,
    "category": [
      "newuser",
      "transactional"
    ],
    "event": "open"
  },
  {
    "email": "test2@example.com",
    "timestamp": 1337966815,
    "category": "olduser",
    "event": "open"
  }
]</code>
ログイン後にコピー
ソリューション:カスタムJSONCONVERR

この問題をエレガントに解決するために、最良の解決策はカスタム

を作成することです。 コンバーターは、

属性の値タイプを識別し、JsonConverterに正しく変換できます。 categories List<string>コードの例:

このコードは、

クラスと汎用
<code class="language-csharp">using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

public 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; }
}

public 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 => false; // 只支持反序列化

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

public class Example
{
    public static void Main(string[] args)
    {
        string json = @"
        [
          {
            ""email"": ""test1@example.com"",
            ""timestamp"": 1337966815,
            ""category"": [
              ""newuser"",
              ""transactional""
            ],
            ""event"": ""open""
          },
          {
            ""email"": ""test2@example.com"",
            ""timestamp"": 1337966815,
            ""category"": ""olduser"",
            ""event"": ""open""
          }
        ]";

        List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json);

        foreach (var item in items)
        {
            Console.WriteLine($"Email: {item.Email}, Timestamp: {item.Timestamp}, Event: {item.Event}, Categories: {string.Join(", ", item.Categories)}");
        }
    }
}</code>
ログイン後にコピー
を定義します。

シングルとアレイを処理し、Itemに変換できます。 メインプログラムは、コンバーターのバックシリアル化JSONデータを使用する方法を示しています。 このコンバーターは劣化のみをサポートすることに注意してください(SingleOrArrayConverter)。 SingleOrArrayConverter List<string> CanWrite => false

以上が同じプロパティの単一のアイテムまたはアレイのjson.netの降下を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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