在 JsonDeserializer 中正确跳过父级

问题描述

我收到的 HttpResponseMessage 如下所示(数据已编辑):

{
  "tracks" : {
    "href" : "{href_here}","items" : [ {
      "album" : {
        //stuff here
      },"name": "{name here}"
    },{
      "album" : {
        //more stuff here
      },"name": "{other name here}"
    }
  }
}

我的模型如下所示:

using System.Text.Json.Serialization;

namespace ProjectName.Models
{
    public class Track
    {
        [JsonPropertyName("album")]
        public Album Album { get; set; }
        
        [JsonPropertyName("name")]
        public string Name { get; set; }
    }
}

然后我尝试像这样反序列化响应:

var response = await _httpClient.GetAsync("URL HERE");

response.EnsureSuccessstatusCode();

return JsonSerializer.Deserialize<IEnumerable<Track>>(await response.Content.ReadAsstringAsync());

我想检索曲目列表(对应于 JSON 中的 items)。

我无法在网上找到“跳过”父属性并仅反序列化特定子属性方法(在本例中为 items)。我不需要 href(以及我已删除的其他属性)。

有没有办法做到这一点?

解决方法

using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace StackOverflow
{
    public class Album
    {
    }

    public class Item
    {
        [JsonPropertyName("album")]
        public Album Album { get; set; }
        [JsonPropertyName("name")]
        public string Name { get; set; }
    }

    public class Tracks
    {
        [JsonPropertyName("href")]
        public string Href { get; set; }
        [JsonPropertyName("items")]
        public List<Item> Items { get; set; }
    }

    public class Root
    {
        [JsonPropertyName("tracks")]
        public Tracks Tracks { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var jsonStr = "{\"tracks\":{\"href\":\"{href_here}\",\"items\" : [{\"album\" : { },\"name\": \"{name here}\"}]}}";

            var root = JsonSerializer.Deserialize<Root>(jsonStr);

           //Here is your "IEnumerable<Track>"
            var items = root.Tracks.Items;
        }
    }
}

您的模型必须具有这样的结构,然后它会按预期反序列化您的数据。然后您可以使用 Linq 将结果转换为您想要的每种格式。