【问题标题】:Problems deserializing Json from MusixMatch API?从 MusixMatch API 反序列化 Json 的问题?
【发布时间】:2019-09-13 15:24:39
【问题描述】:

我正在尝试实现 MusixMatch API,我必须承认,当我调试时,我无法在 API 调用后看到 ObservableCollection 中的内容,因为调试器会跳转到另一个线程(我在线程管理方面的专业知识为零),但是我可以从 API 响应中看到什么,Visual Studio 说不是 Json 格式:

  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;

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

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 的响应内容,您可以查看完整的响应:

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)

【问题讨论】:

  • 响应字符串似乎包含“callback(...)”,这确实不是 JSON。在进行反序列化之前,您可能希望格式化响应字符串以删除包装实际 JSON 的字符。

标签: c# json json.net json-deserialization


【解决方案1】:

看起来您在 URL 中传递了一个参数 format=jsonpJSONP 是一种将 JSON 数据包装在回调函数中的格式。它旨在从 HTML 页面中的 &lt;script&gt; 标记中使用。如果您想要纯 JSON,请尝试将该参数更改为 format=json 并删除相应的 callback 参数。或者您可以尝试同时删除 formatcallback 参数,假设 JSON 是默认格式。

如果这不起作用,那么另一种选择是在尝试将其解析为 JSON 之前从响应字符串中剥离 callback() 函数包装器。您可以使用这样的辅助方法来做到这一点:

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;
}

【讨论】:

    【解决方案2】:

    您需要将代码更新为:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多