newtonsoft.json
属性を使用すると、元のjson属性名をクラス属性に許可します。ただし、場合によっては、複雑なJSONオブジェクトのサブアトリビュートは、JSONオブジェクトのサブアトリビュートの単純な属性にマッピングされる場合があります。
[DataMember]
伝統的な方法
追加の属性のみが必要な場合、1つの方法は、JSONをjobjectとして解決し、および
を使用してクラスを入力して追加の属性を取得することです。
ToObject()
属性のみが必要な複雑なSelectToken()
属性を含むjsonオブジェクトを検討してください:
picture
picture.data.url
custom jsonコンバーター
<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>
属性が期待どおりに機能するようにカスタムJSonConverterを作成できます。このコンバーターは、反射と上記のテクノロジーを使用して属性を埋めるためにクラスレベルで実行されます。
実証するために、より複雑なJSONオブジェクトを検討してください:
[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>
以上がNewtonsoft.JSONの脱介入のクラスプロパティに子供のJSONプロパティをマッピングする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。