Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk memetakan sifat Json Child ke Properties Kelas di Newtonsoft.Json Deserialization?

Bagaimana untuk memetakan sifat Json Child ke Properties Kelas di Newtonsoft.Json Deserialization?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-24 23:12:11470semak imbas

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

sub -atribut Morneled ke atribut kelas

semasa padang pasir di Newtonsoft.json Atribut NewtonSoft.Json

membolehkan nama atribut JSON asal ke atribut kelas. Walau bagaimanapun, dalam beberapa kes, sub -atribut objek JSON kompleks boleh dipetakan ke dalam atribut mudah sub -attribut objek JSON.

[DataMember] Kaedah tradisional

Jika anda hanya memerlukan atribut tambahan, satu kaedah adalah untuk menyelesaikan JSON sebagai jobject dan gunakan dan

untuk mengisi kelas dan mendapatkan atribut tambahan.

ToObject() Pertimbangkan objek JSON, yang mengandungi atribut SelectToken() kompleks, dan kelas, yang hanya memerlukan atribut

:

picture picture.data.url

Custom JSON Converter
<code class="language-json">{
    "picture": 
    {
        "id": 123456,
        "data": 
        {
            "type": "jpg",
            "url": "http://www.someplace.com/mypicture.jpg"
        }
    }
}</code>
<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>

Untuk mendapatkan penyelesaian yang lebih elegan, anda boleh membuat jsonConverter tersuai untuk membolehkan atribut berfungsi seperti yang diharapkan. Penukar ini berjalan di peringkat kelas, menggunakan refleks dan teknologi di atas untuk mengisi atribut.

Untuk menunjukkan, pertimbangkan objek JSON yang lebih rumit: [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>
Dalam kelas sasaran di bawah, setiap laluan atribut menggunakan

spesifikasi atribut:

<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>

Dengan atribut ini, penyerapan yang mendalam harus lancar: [JsonProperty]

Atas ialah kandungan terperinci Bagaimana untuk memetakan sifat Json Child ke Properties Kelas di Newtonsoft.Json Deserialization?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn