c# - 在 JsonDeserializer 中正确跳过父级

标签 c# json json-deserialization system.text.json httpresponsemessage

我收到的 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 将结果转换为您想要的每种格式。

关于c# - 在 JsonDeserializer 中正确跳过父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65659445/

相关文章:

C# 想要输入年份并提取放置的日期

c# - IEnumerable Count() 和 Length 之间的区别

python - 从 JSON 文件中读取阿拉伯语

javascript - 使用 AJAX JSON 调用时内存泄漏

scala - 使用 json4s 反序列化嵌套多态 json 字段

c# - Thread.Sleep(300) 无法正常工作

c# - catch 关键字如何确定抛出的异常类型?

javascript - 使用捕获组查找并替换 json 字符串中所有出现的短语

php - 在 PHP 中检查字符串是否为 JSON 的最快方法?

java - 处理 API 请求时出现 MismatchedInputException