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()
-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>
<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>
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>
<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>
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>
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!