属性を使用して JSON のサブプロパティにアクセスしますか?
Newtonsoft.Json の DeserializeObject<T>
を使用した JSON 逆シリアル化により、[DataMember(Name = "raw_property_name")]
を使用して生の JSON データをクラス プロパティにマッピングできます。しかし、複雑な JSON オブジェクトのサブプロパティをクラス内の単純なプロパティにマップしたい場合はどうすればよいでしょうか?
たとえば、次の JSON について考えてみましょう:
<code class="language-json">{ "picture": { "id": 123456, "data": { "type": "jpg", "url": "http://www.someplace.com/mypicture.jpg" } } }</code>
おそらく picture
オブジェクトの url
プロパティのみに興味があるので、クラス内に複雑なオブジェクトを作成したくないでしょう。このように単純にマッピングできますか?
<code class="language-csharp">[DataMember(Name = "picture.data.url")] public string ProfilePicture { get; set; }</code>
ダイレクト パス マッピングに JObject を使用する
簡単な方法は、JSON を JObject
に解析することです。次に、 ToObject()
を使用して JObject
からクラスを設定します。追加のプロパティを抽出するには、SelectToken()
:
<code class="language-csharp">string json = @" { ""name"" : ""Joe Shmoe"", ""age"" : 26, ""picture"": { ""id"": 123456, ""data"": { ""type"": ""jpg"", ""url"": ""http://www.someplace.com/mypicture.jpg"" } } }"; JObject jo = JObject.Parse(json); Person p = jo.ToObject<Person>(); p.ProfilePicture = (string)jo.SelectToken("picture.data.url");</code>
プロパティベースのマッピング用のカスタム JsonConverter
または、カスタム JsonConverter
を作成して、必要に応じて JsonProperty
属性を有効にしてサブプロパティをマッピングすることもできます。
<code class="language-csharp">class JsonPathConverter : JsonConverter { // ... 实现代码在问题答案中提供 ... }</code>
使用方法:
<code class="language-csharp">[JsonConverter(typeof(JsonPathConverter))] class Person { [JsonProperty("name")] public string Name { get; set; } [JsonProperty("picture.data.url")] public string ProfilePicture { get; set; } // ... 其他属性 ... } Person p = JsonConvert.DeserializeObject<Person>(json);</code>
これにより、サブプロパティに属性ベースのマッピングを使用できるようになり、JSON データをクラス オブジェクトに逆シリアル化する際の柔軟性が向上します。
以上が属性を使用して、子JSONプロパティをクラスプロパティにマッピングできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。