首页 > 后端开发 > C++ > 我可以使用属性将子 JSON 属性映射到类属性吗?

我可以使用属性将子 JSON 属性映射到类属性吗?

Patricia Arquette
发布: 2025-01-24 23:02:14
原创
325 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板