ホームページ >バックエンド開発 >C++ >属性を使用して、子JSONプロパティをクラスプロパティにマッピングできますか?

属性を使用して、子JSONプロパティをクラスプロパティにマッピングできますか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-24 23:02:14333ブラウズ

Can I Map Child JSON Properties to Class Properties Using Attributes?

属性を使用して 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。