C# 反序列化具有无效变量名的嵌套json
我正在使用C#中的最后一个.FM API。我以前很少使用Json,所以这对我来说有点陌生 我试图解析的json看起来像C# 反序列化具有无效变量名的嵌套json,c#,json,httpwebrequest,json-deserialization,C#,Json,Httpwebrequest,Json Deserialization,我正在使用C#中的最后一个.FM API。我以前很少使用Json,所以这对我来说有点陌生 我试图解析的json看起来像 "{ \"topalbums\": { \"album\": [ { \"name\": \"California (Deluxe Edition)\", \"playcount\": \"89\", \"mbid\": \"\", \"url\": \"https: \/\/www.las
"{
\"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\"
}
},
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;
}
我反序列化json的代码如下所示
"{
\"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\"
}
},
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;
}
公共列表GetTopAlbumsDeserialized(整数限制)
{
List topAlbumList=新列表();
var request=(HttpWebRequest)WebRequest.Create(
webServiceURL+“/2.0/?method=user.gettopalbums&user=“+user+”&api_key=“+key+”&format=json”);
如果(限制>0)
{
请求=(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();
使用(var sr=newstreamreader(response.GetResponseStream())
{
字符串responseString=sr.ReadToEnd();
高级关闭();
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(topAlbumsArray.ToString());
}
返回TopAlbum列表;
}
我的反序列化专辑的代码一开始似乎基本正常。但是,当我查看返回的列表时,对于每个相册对象,我的图像列表是空的,秩变量是空的
我已经编写了代码,可以导航到json中的相册数组,并只解析每个相册,但它看起来不太好。不过,我认为我没有为Image和TopAlbum类正确编写JSONProperty
这是我的物品供参考
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; }
}
公共类相册
{
公共字符串名称{get;set;}
公共字符串播放计数{get;set;}
公共字符串mbid{get;set;}
公共字符串url{get;set;}
公共艺术家{get;set;}
公共列表图像{get;set;}
}
公共类TopAlbum:Album
{
公共字符串秩{get;set;}
}
公众阶级形象
{
[JsonProperty(“#text”)]
公共字符串文本{get;set;}
公共字符串大小{get;set;}
}
公共级艺术家
{
公共字符串名称{get;set;}
公共字符串mbid{get;set;}
公共字符串url{get;set;}
}
使用,您的模型应该是这样的
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; }
}
公共类艺术家
{
公共字符串名称{get;set;}
公共字符串mbid{get;set;}
公共字符串url{get;set;}
}
公众阶级形象
{
[JsonProperty(“#text”)]
公共字符串文本{get;set;}
公共字符串大小{get;set;}
}
公共类属性
{
公共字符串秩{get;set;}
}
公开课相册
{
公共字符串名称{get;set;}
公共字符串播放计数{get;set;}
公共字符串mbid{get;set;}
公共字符串url{get;set;}
公共艺术家{get;set;}
公共列表映像{get;set;}
[JsonProperty(“@attr”)]
公共属性Attr{get;set;}
}
公共类属性2
{
公共字符串用户{get;set;}
公共字符串页{get;set;}
每个页面的公共字符串{get;set;}
公共字符串totalPages{get;set;}
公共字符串总计{get;set;}
}
公共级顶级专辑
{
公共列表相册{get;set;}
[JsonProperty(“@attr”)]
公共属性2属性{get;set;}
}
公共类根对象
{
公共Topalbums Topalbums{get;set;}
}
现在可以反序列化为
var result = JsonConvert.DeserializeObject<RootObject>(json);
var result=JsonConvert.DeserializeObject(json);