如何在将JSON反序列化为C#时处理更改的元素名称

本文关键字:处理 元素 JSON 反序列化 | 更新日期: 2023-09-27 18:21:21

这是处理fanart.tv Web服务响应JSON和C#的后续内容

因此,对于艺术家来说,你会得到一个响应,其中主要元素的名称与艺术家相同(因此,你将Metallica的拇指Web服务称为Metallica,Megadeth的根被称为Megadeth)

上一个问题解决了这个问题,但下一个阶段是相册,它最终包含两个级别的动态命名元素,因此搜索特定的相册就会得到

{"Metallica":{"mbid_id":"65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab","albums":{"f44f4f73-a714-31a1-a4b8-bfcaaf311f50":{"albumcover":[{"id":"51252","url":"http://assets.fanart.tv/fanart/music/65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab/albumcover/kill-em-all-504c485914b25.jpg","likes":"2"}]}}}}

因此,您有相同的顶级艺术家详细信息和动态名称,但现在对于专辑,您有一个以MusicbrainzID命名的元素,然后是拇指集合。

对于艺术家的详细信息,我定义了类

public class ArtistThumbs
{
  public string Name { get; set; }
  [JsonProperty("mbid_id")]
  public string MusicBrainzID { get; set; }
  [JsonProperty("artistthumb")]
  public List<Thumb> Thumbs { get; set; }
}

public class Thumb
{
  [JsonProperty("id")]
  public string Id { get; set; }
  [JsonProperty("url")]
  public string Url { get; set; }
  [JsonProperty("likes")]
  public string Likes { get; set; }
}

然后我可以使用将艺术家反序列化为JSON

var artistthumbs = JsonConvert.DeserializeObject<Dictionary<string, Artist>>(json);

问题是我怎样才能为这些专辑做同样的事情?如果可能的话,我真的需要尝试并坚持使用JsonConvert.DeserializeObject,并且真的想反序列化到类,但我不知道如何对类

如何在将JSON反序列化为C#时处理更改的元素名称

建模

与其他问题的想法相同。无论何时动态更改JSON对象的属性名称,都需要使用Dictionary。您可以很容易地扩展现有的类来处理这个问题。

首先,定义另一个类来保存专辑的封面拇指列表:

class Album
{
    [JsonProperty("albumcover")]
    public List<Thumb> CoverThumbs { get; set; }
}

然后将以下内容添加到您的ArtistThumbs类中:

[JsonProperty("albums")]
public Dictionary<string, Album> Albums { get; set; }

然后你就可以像你一直在做的那样反序列化:

var artistthumbs = JsonConvert.DeserializeObject<Dictionary<string, ArtistThumbs>>(json);

Albums属性现在有相册,其中字典中的每个键都是相册的"MusicbrainzID",每个值都是相应的相册信息。