Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk memetakan sifat Json Child ke Properties Kelas di Newtonsoft.Json Deserialization?
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
<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!