Heim > Backend-Entwicklung > C++ > Wie kann ich mit JSON.NET Deserialisierung eines einzelnen Elements oder Arrays für dieselbe Eigenschaft umgehen?

Wie kann ich mit JSON.NET Deserialisierung eines einzelnen Elements oder Arrays für dieselbe Eigenschaft umgehen?

Barbara Streisand
Freigeben: 2025-02-02 20:46:12
Original
434 Leute haben es durchsucht

einzelnes Projekt oder Array desselben Attributs in json.net

In diesem Artikel wird besprochen, wie JSON.NET verwendet wird, um die von der API zurückgegebenen JSON -Daten zu verarbeiten. Wenn Sie die SendGrid -Ereignis -API als Beispiel nehmen, kann sein categories Attribut eine einzelne Zeichenfolge oder ein String -Array sein.

Frage: In den von der

SendGrid -Ereignis -API zurückgegebenen JSON -Daten ist das Format des

-Treibers inkonsistent. categories

Beispiel 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>
Nach dem Login kopieren
Lösung: benutzerdefinierte JsonConverr

Um dieses Problem elegant zu lösen, besteht die beste Lösung darin, einen benutzerdefinierten

zu erstellen. Der Konverter kann den Werttyp des JsonConverter -attributs identifizieren und korrekt in categories umwandeln. List<string>

Code Beispiel:

<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>
Nach dem Login kopieren
Dieser Code definiert eine

Klasse und eine generische Item. SingleOrArrayConverter kann einzeln und ein Array verarbeiten und es in SingleOrArrayConverter umwandeln. Das Hauptprogramm zeigt, wie die JSON -Daten des Konverters der Back Serialization JSON verwendet werden. Beachten Sie, dass dieser Konverter nur den Abbau unterstützt (List<string>). CanWrite => false

Das obige ist der detaillierte Inhalt vonWie kann ich mit JSON.NET Deserialisierung eines einzelnen Elements oder Arrays für dieselbe Eigenschaft umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage