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