简介
在 Newtonsoft.Json 中创建自定义反序列化行为可以通过自定义属性和转换器来实现。这允许您将 JSON 对象中的子属性映射到 C# 类中的简单属性,即使它们没有对应的对象。
使用辅助方法
如果您只需要一个额外的属性,一个简单的方法是将您的 JSON 解析为 JObject,使用 ToObject() 填充您的类,然后使用 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 属性标记的属性。JsonConverter 可以使用反射来查找属性,将它们映射到正确的 JSON 路径,并相应地填充属性。
<code class="language-csharp">class JsonPathConverter : JsonConverter { // ReadJson 实现在此处... }</code>
关联自定义转换器
使用 [JsonConverter] 属性将自定义转换器与目标类关联。然后,您可以将 [JsonProperty] 属性应用于所需的属性,并将 JSON 路径指定为属性名称。
<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; } }</code>
使用这些属性后,您可以像往常一样反序列化 JSON,映射将自动发生。
以上是如何将嵌套的JSON属性映射到简单的C#属性?的详细内容。更多信息请关注PHP中文网其他相关文章!