首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MusixMatch API反序列化Json时出现问题?

从MusixMatch API反序列化Json时出现问题?
EN

Stack Overflow用户
提问于 2019-09-13 23:24:40
回答 2查看 125关注 0票数 1

我正在尝试实现Json应用程序接口,我必须承认,当我调试时,我无法看到在API调用之后ObservableCollection中有什么,因为调试器跳转到另一个线程(我对线程管理一无所知),但是我可以从API响应中看到什么,Visual Studio说不是Json格式的:

代码语言:javascript
复制
  HttpClient httpClient = new HttpClient();

        var response = await httpClient.GetStringAsync($"https://api.musixmatch.com/ws/1.1/artist.search?format=jsonp&callback=callback&q_artist=queen&page=1&page_size=5&apikey={apikey}"); 
        RootObject testList= JsonConvert.DeserializeObject<RootObject>(response);
        return testList;

我有一个具有这种结构的模型:

代码语言:javascript
复制
public class Header
{
    public int status_code { get; set; }
    public double execute_time { get; set; }
    public int available { get; set; }
}

public class ArtistNameTranslation
{
    public string language { get; set; }
    public string translation { get; set; }
}

public class ArtistNameTranslationList
{
    public ArtistNameTranslation artist_name_translation { get; set; }
}

public class ArtistAliasList
{
    public string artist_alias { get; set; }
}

public class ArtistCredits
{
    public List<object> artist_list { get; set; }
}

public class Artist
{
    public int artist_id { get; set; }
    public string artist_name { get; set; }
    public List<ArtistNameTranslationList> artist_name_translation_list { get; set; }
    public string artist_comment { get; set; }
    public string artist_country { get; set; }
    public List<ArtistAliasList> artist_alias_list { get; set; }
    public int artist_rating { get; set; }
    public string artist_twitter_url { get; set; }
    public ArtistCredits artist_credits { get; set; }
    public int restricted { get; set; }
    public DateTime updated_time { get; set; }
}

public class ArtistList
{
    public Artist artist { get; set; }
}

public class Body
{
    public List<ArtistList> artist_list { get; set; }
}

public class Message
{
    public Header header { get; set; }
    public Body body { get; set; }
}

public class RootObject
{
    public Message message { get; set; }
}

}

正如我所说的,我能够看到API响应中的内容,您可以查看完整的响应:

代码语言:javascript
复制
callback({"message":{"header":    {"status_code":200,"execute_time":0.043232917785645,"available":6936},"body":{"artist_list":[{"artist":{"artist_id":118,"artist_name":"Queen","artist_name_translation_list":[{"artist_name_translation":{"language":"JA","translation":"\u30af\u30a4\u30fc\u30f3"}}],"artist_comment":"","artist_country":"","artist_alias_list":[{"artist_alias":"\u30af\u30a4\u30fc\u30f3"},{"artist_alias":"Queen + Adam Lambert"}],"artist_rating":99,"artist_twitter_url":"","artist_credits":{"artist_list":[]},"restricted":0,"updated_time":"2015-12-16T15:50:53Z"}},{"artist":{"artist_id":13755603,"artist_name":"Queen with David Bowie","artist_name_translation_list":[{"artist_name_translation":{"language":"EN","translation":"Queen"}}],"artist_comment":"","artist_country":"","artist_alias_list":[{"artist_alias":"Queen"}],"artist_rating":38,"artist_twitter_url":"","artist_credits":{"artist_list":[{"artist":{"artist_id":118,"artist_name":"Queen","artist_name_translation_list":[{"artist_name_translation":{"language":"JA","translation":"\u30af\u30a4\u30fc\u30f3"}}],"artist_comment":"","artist_country":"","artist_alias_list":[{"artist_alias":"\u30af\u30a4\u30fc\u30f3"},{"artist_alias":"Queen + Adam Lambert"}],"artist_rating":99,"artist_twitter_url":"","artist_credits":{"artist_list":[]},"restricted":0,"updated_time":"2015-12-16T15:50:53Z"}},{"artist":{"artist_id":431,"artist_name":"David Bowie","artist_name_translation_list":[{"artist_name_translation":{"language":"JA","translation":"\u30c7\u30f4\u30a3\u30c3\u30c9\u30fb\u30dc\u30a6\u30a4"}}],"artist_comment":"","artist_country":"GB","artist_alias_list":[{"artist_alias":"\u30c7\u30f4\u30a3\u30c3\u30c9\u30fb\u30dc\u30a6\u30a4"},{"artist_alias":"David Robert Jones"},{"artist_alias":"David Jones"},{"artist_alias":"Ziggy Stardust"},{"artist_alias":"\ub370\uc774\ube44\ub4dc \ubcf4\uc704"},{"artist_alias":"\u0414\u044d\u0432\u0438\u0434 \u0411\u043e\u0443\u0438"},{"artist_alias":"Davis Bowie"},{"artist_alias":"Bowie"},{"artist_alias":"\u30c7\u30d3\u30c3\u30c9\u30fb\u30dc\u30a6\u30a4"},{"artist_alias":"David Bowie"},{"artist_alias":"Davie Bowie"},{"artist_alias":"The Thin White Duke"}],"artist_rating":85,"artist_twitter_url":"","artist_credits":{"artist_list":[]},"restricted":0,"updated_time":"2018-10-20T16:37:59Z"}}]},"restricted":0,"updated_time":"2015-12-01T18:35:35Z"}},{"artist":{"artist_id":17057,"artist_name":"Queen Latifah","artist_name_translation_list":[{"artist_name_translation":{"language":"JA","translation":"\u30af\u30a4\u30fc\u30f3\u30fb\u30e9\u30c6\u30a3\u30d5\u30a1"}}],"artist_comment":"","artist_country":"US","artist_alias_list":[{"artist_alias":"\u30af\u30a4\u30fc\u30f3\u30fb\u30e9\u30c6\u30a3\u30d5\u30a1"},{"artist_alias":"Queen Latifa"},{"artist_alias":"Dana Owens"}],"artist_rating":46,"artist_twitter_url":"","artist_credits":{"artist_list":[]},"restricted":0,"updated_time":"2013-11-05T11:25:25Z"}},{"artist":{"artist_id":7321,"artist_name":"Queens of the Stone Age","artist_name_translation_list":[{"artist_name_translation":{"language":"RU","translation":"Queens Of The Stone Age"}}],"artist_comment":"","artist_country":"US","artist_alias_list":[{"artist_alias":"\u30af\u30a4\u30fc\u30f3\u30ba\u30aa\u30d6\u30b6\u30b9\u30c8\u30fc\u30f3\u30a8\u30a4\u30b8"},{"artist_alias":"Queens Of The Stone Age"},{"artist_alias":"shiqishidaihuanghou"},{"artist_alias":"Queen Of Stoneage"},{"artist_alias":"Queens Of The Stoneage"},{"artist_alias":"QOTSA"}],"artist_rating":76,"artist_twitter_url":"https:\/\/twitter.com\/qotsa","artist_credits":{"artist_list":[]},"restricted":0,"updated_time":"2015-12-09T18:04:11Z"}},{"artist":{"artist_id":26029011,"artist_name":"\u5973\u738b\u8702","artist_name_translation_list":[{"artist_name_translation":{"language":"EN","translation":"Queen Bee"}}],"artist_comment":"","artist_country":"JP","artist_alias_list":[{"artist_alias":"Queen Bee"}],"artist_rating":48,"artist_twitter_url":"","artist_credits":{"artist_list":[]},"restricted":0,"updated_time":"2019-07-15T13:55:16Z"}}]}}});

(https://drive.google.com/file/d/1RH9qxrCfKOXdX16eKy74iWhtbnfT46mD/view?usp=sharing)

正如我所说的,Visual Studio告诉我响应不是Json>格式的

(https://drive.google.com/file/d/1MoZlKEIbh8Epp_CC9gukWYtMBwp5oXwy/view?usp=sharing)

EN

回答 2

Stack Overflow用户

发布于 2019-09-14 01:45:05

看起来您要在URL中传递一个参数format=jsonpJSONP是一种将JSON数据包装在回调函数中的格式。它的目的是在超文本标记语言页面的<script>标签中使用它。如果需要普通的JSON,请尝试将该参数更改为format=json并删除相应的callback参数。或者,您可以尝试删除formatcallback参数,假设JSON是默认格式。

如果这不起作用,那么另一种替代方法是在尝试将响应字符串解析为callback()之前,从响应字符串中剥离JSON函数包装器。您可以使用下面这样的helper方法来完成此操作:

代码语言:javascript
复制
public static string ExtractJson(string text)
{
    int i = text.IndexOf('(');
    int j = text.LastIndexOf(')');
    return i > -1 && j > i ? text.Substring(i + 1, j - i - 1) : null;
}
票数 1
EN

Stack Overflow用户

发布于 2019-09-14 00:07:16

您需要更新您的代码以:

代码语言:javascript
复制
var response = await httpClient.GetStringAsync($"https://api.musixmatch.com/ws/1.1/artist.search?format=jsonp&callback=callback&q_artist=queen&page=1&page_size=5&apikey={apikey}"); 

var contents = await response.Content.ReadAsStringAsync();

RootObject testList= JsonConvert.DeserializeObject<RootObject>(contents);

return testList;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57926393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档