Heim > Backend-Entwicklung > C++ > Wie kann ich Kinder -JSON -Eigenschaften auf Klasseneigenschaften in newtonsoft.json -Deserialisierung zuordnen?

Wie kann ich Kinder -JSON -Eigenschaften auf Klasseneigenschaften in newtonsoft.json -Deserialisierung zuordnen?

Mary-Kate Olsen
Freigeben: 2025-01-24 23:12:11
Original
464 Leute haben es durchsucht

How to Map Child JSON Properties to Class Properties in Newtonsoft.Json Deserialization?

Ordnen Sie untergeordnete Eigenschaften den Klasseneigenschaften zu, wenn Sie in Newtonsoft.Json deserialisieren

Das

-Attribut in Newtonsoft.Json ermöglicht die Zuordnung von unformatierten JSON-Eigenschaftsnamen zu Klasseneigenschaften. In einigen Fällen müssen Sie jedoch möglicherweise Untereigenschaften eines komplexen JSON-Objekts einfachen Eigenschaften in einer Klasse zuordnen. [DataMember]

Traditionelle Methode

Wenn Sie nur eine zusätzliche Eigenschaft benötigen, besteht eine Möglichkeit darin, den JSON in ein JObject zu analysieren und

und ToObject() zu verwenden, um die Klasse zu füllen und die zusätzliche Eigenschaft abzurufen. SelectToken()

Stellen Sie sich ein JSON-Objekt vor, das ein komplexes

-Attribut enthält, und eine Klasse, bei der nur das picture-Attribut erforderlich ist: picture.data.url

<code class="language-json">{
    "picture": 
    {
        "id": 123456,
        "data": 
        {
            "type": "jpg",
            "url": "http://www.someplace.com/mypicture.jpg"
        }
    }
}</code>
Nach dem Login kopieren
<code class="language-csharp">public class Person
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("age")]
    public string Age { get; set; }

    public string ProfilePicture { get; set; }
}

string json = @"{...}";

JObject jo = JObject.Parse(json);
Person p = jo.ToObject<Person>();
p.ProfilePicture = (string)jo.SelectToken("picture.data.url");</code>
Nach dem Login kopieren

Benutzerdefinierter JSON-Konverter

Für eine elegantere Lösung können Sie einen benutzerdefinierten JsonConverter erstellen, der dafür sorgt, dass die

-Eigenschaften wie erwartet funktionieren. Dieser Konverter arbeitet auf Klassenebene und nutzt Reflektion und die oben beschriebenen Techniken zum Auffüllen von Eigenschaften. [JsonProperty]

<code class="language-csharp">public class JsonPathConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        object targetObj = Activator.CreateInstance(objectType);

        foreach (var prop in objectType.GetProperties()
                                        .Where(p => p.CanRead && p.CanWrite))
        {
            var att = prop.GetCustomAttributes(true)
                           .OfType<JsonPropertyAttribute>()
                           .FirstOrDefault();

            string jsonPath = (att != null ? att.PropertyName : prop.Name);
            JToken token = jo.SelectToken(jsonPath);

            if (token != null && token.Type != JTokenType.Null)
            {
                object value = token.ToObject(prop.PropertyType, serializer);
                prop.SetValue(targetObj, value, null);
            }
        }

        return targetObj;
    }
}</code>
Nach dem Login kopieren
Betrachten Sie zur Demonstration ein komplexeres JSON-Objekt:

<code class="language-json">{
  "name": "Joe Shmoe",
  "age": 26,
  "picture": {
    "id": 123456,
    "data": {
      "type": "jpg",
      "url": "http://www.someplace.com/mypicture.jpg"
    }
  },
  "favorites": {
    "movie": {
      "title": "The Godfather",
      "starring": "Marlon Brando",
      "year": 1972
    },
    "color": "purple"
  }
}</code>
Nach dem Login kopieren
In der Zielklasse unten wird jeder Eigenschaftspfad mit dem Attribut

angegeben: [JsonProperty]

<code class="language-csharp">[JsonConverter(typeof(JsonPathConverter))]
public class Person
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("age")]
    public int Age { get; set; }

    [JsonProperty("picture.data.url")]
    public string ProfilePicture { get; set; }

    [JsonProperty("favorites.movie")]
    public Movie FavoriteMovie { get; set; }

    [JsonProperty("favorites.color")]
    public string FavoriteColor { get; set; }
}

public class Movie
{
    public string Title { get; set; }
    public int Year { get; set; }
}</code>
Nach dem Login kopieren
Mit diesen Eigenschaften sollte die Deserialisierung reibungslos funktionieren:

Das obige ist der detaillierte Inhalt vonWie kann ich Kinder -JSON -Eigenschaften auf Klasseneigenschaften in newtonsoft.json -Deserialisierung zuordnen?. 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