2017-08-30 4 views
0

Je suis en train de jouer avec l'API Last.FM en C#. Je n'ai pas beaucoup utilisé Json auparavant, donc c'est un peu nouveau pour moi.Désérialisation de json imbriqué avec des noms de variables non valides

JSON Je suis en train d'analyser ressemble

"{ 
    \"topalbums\": { 
    \"album\": [ 
     { 
     \"name\": \"California (Deluxe Edition)\", 
     \"playcount\": \"89\", 
     \"mbid\": \"\", 
     \"url\": \"https: \/\/www.last.fm\/music\/blink-182\/California+(Deluxe+Edition)\", 
     \"artist\": { 
      \"name\": \"blink-182\", 
      \"mbid\": \"0743b15a-3c32-48c8-ad58-cb325350befa\", 
      \"url\": \"https: \/\/www.last.fm\/music\/blink-182\" 
     }, 
     \"image\": [ 
      { 
      \"#text\": \"https: \/\/lastfm-img2.akamaized.net\/i\/u\/34s\/ccd85fcfa4370e1df83a67c7fa79096c.png\", 
      \"size\": \"small\" 
      }, 
      { 
      \"#text\": \"https: \/\/lastfm-img2.akamaized.net\/i\/u\/64s\/ccd85fcfa4370e1df83a67c7fa79096c.png\", 
      \"size\": \"medium\" 
      }, 
      { 
      \"#text\": \"https: \/\/lastfm-img2.akamaized.net\/i\/u\/174s\/ccd85fcfa4370e1df83a67c7fa79096c.png\", 
      \"size\": \"large\" 
      }, 
      { 
      \"#text\": \"https: \/\/lastfm-img2.akamaized.net\/i\/u\/300x300\/ccd85fcfa4370e1df83a67c7fa79096c.png\", 
      \"size\": \"extralarge\" 
      } 
     ], 
     \"@attr\": { 
      \"rank\": \"1\" 
     } 
     }, 

Mon code désérialiser le JSON ressemble

public List<TopAlbum> GetTopAlbumsDeserialized(int limit) 
     { 
      List<TopAlbum> topAlbumList = new List<TopAlbum>(); 
      var request = (HttpWebRequest)WebRequest.Create(
       webServiceURL + "/2.0/?method=user.gettopalbums&user=" + user + "&api_key=" + key + "&format=json"); 
      if (limit > 0) 
      { 
       request = (HttpWebRequest)WebRequest.Create(
        webServiceURL + "/2.0/?method=user.gettopalbums&user=" + user + "&limit=" + limit 
        + "&api_key=" + key + "&format=json"); 
      } 
      request.ContentType = "application/json; charset=utf-8"; 
      request.Method = WebRequestMethods.Http.Get; 
      request.Accept = "application/json"; 
      var response = (HttpWebResponse)request.GetResponse(); 
      using (var sr = new StreamReader(response.GetResponseStream())) 
      { 
       string responseString = sr.ReadToEnd(); 
       sr.Close(); 
       JContainer jContainer = JObject.Parse(responseString); 
       JArray topAlbumsArray = JArray.FromObject(jContainer.First().First().First().First()); 
       JObject.FromObject(jContainer.First().First().First().First()["image"]); 
       topAlbumList = JsonConvert.DeserializeObject<List<TopAlbum>>(topAlbumsArray.ToString()); 
      } 
      return topAlbumList; 
     } 

Mon code désérialiser les albums semblait fonctionner la plupart du temps correct au premier abord. Mais, quand je regarde la liste qui est retournée, pour chaque objet Album, ma liste d'images est vide et la variable de rang est nulle.

J'ai écrit du code qui va naviguer dans le tableau d'album dans le json, et juste analyser chaque album, mais il ne semble pas aussi bien. Je ne pense pas que j'ai correctement écrit JsonPropertys pour les classes Image et TopAlbum.

Voici mes objets de référence.

public class Album 
    { 
     public string name { get; set; } 
     public string playcount { get; set; } 
     public string mbid { get; set; } 
     public string url { get; set; } 
     public Artist artist { get; set; } 
     public List<Image> images { get; set; } 
    } 
public class TopAlbum : Album 
    { 
     public string rank { get; set; } 
    } 
public class Image 
    { 
     [JsonProperty("#text")] 
     public string text {get; set;} 
     public string size { get; set; } 
    } 
public class Artist 
    { 
     public string name { get; set; } 

     public string mbid { get; set; } 
     public string url { get; set; } 
    } 

Répondre

1

En utilisant this site, votre modèle devrait être comme ça

public class Artist 
{ 
    public string name { get; set; } 
    public string mbid { get; set; } 
    public string url { get; set; } 
} 

public class Image 
{ 
    [JsonProperty("#text")] 
    public string text { get; set; } 
    public string size { get; set; } 
} 

public class Attr 
{ 
    public string rank { get; set; } 
} 

public class Album 
{ 
    public string name { get; set; } 
    public string playcount { get; set; } 
    public string mbid { get; set; } 
    public string url { get; set; } 
    public Artist artist { get; set; } 
    public List<Image> image { get; set; } 
    [JsonProperty("@attr")] 
    public Attr attr { get; set; } 
} 

public class Attr2 
{ 
    public string user { get; set; } 
    public string page { get; set; } 
    public string perPage { get; set; } 
    public string totalPages { get; set; } 
    public string total { get; set; } 
} 

public class Topalbums 
{ 
    public List<Album> album { get; set; } 
    [JsonProperty("@attr")] 
    public Attr2 attr { get; set; } 
} 

public class RootObject 
{ 
    public Topalbums topalbums { get; set; } 
} 

Vous pouvez désérialiser maintenant

var result = JsonConvert.DeserializeObject<RootObject>(json); 
+0

Merci! Je vais définitivement mettre en signet ce site. –