【问题标题】:.NET Deserialize JSON from GET API with header from C#.NET 使用 C# 的标头从 GET API 反序列化 JSON
【发布时间】:2017-03-20 22:03:37
【问题描述】:

经过几个小时的研究,我找不到转换这种 JSON 的方法:

https://api.jamendo.com/v3.0/tracks/?client_id=56d30c95&format=jsonpretty&id=982090

{
    "headers":{
        "status":"success",
        "code":0,
        "error_message":"",
        "warnings":"",
        "results_count":1
    },
    "results":[
        {
            "id":"982090",
            "name":"Seul",
            "duration":297,
            "artist_id":"350774",
            "artist_name":"DON VALDES",
            "artist_idstr":"DON_VALDES",
            "album_name":"EVOLUTION",
            "album_id":"115666",
            "license_ccurl":"http:\/\/creativecommons.org\/licenses\/by-nc-nd\/3.0\/",
            "position":10,
            "releasedate":"2012-11-23",
            "album_image":"https:\/\/imgjam2.jamendo.com\/albums\/s115\/115666\/covers\/1.200.jpg",
            "audio":"https:\/\/mp3l.jamendo.com\/?trackid=982090&format=mp31&from=app-56d30c95",
            "audiodownload":"https:\/\/mp3d.jamendo.com\/download\/track\/982090\/mp32\/",
            "prourl":"https:\/\/licensing.jamendo.com\/track\/982090",
            "shorturl":"http:\/\/jamen.do\/t\/982090",
            "shareurl":"http:\/\/www.jamendo.com\/track\/982090",
            "image":"https:\/\/imgjam2.jamendo.com\/albums\/s115\/115666\/covers\/1.200.jpg"
        }
    ]
}

这是我的方法,但我的对象“track”中的每个值都是空的,我认为这是因为它无法到达 JSON 的“结果”部分(而且我找不到如何关注这部分)或这是因为它无法到达“结果”的第一个成员([0])(而且我也无法专注于第一个元素:/):

public static TrackModel getTrackById(int id)
    {
        Uri uri = new Uri(String.Format("https://api.jamendo.com/v3.0/tracks/?client_id=56d30c95&format=jsonpretty&id={0}", id));
        WebRequest webRequest = WebRequest.Create(uri);
        WebResponse response = webRequest.GetResponse();
        StreamReader streamReader = new StreamReader(response.GetResponseStream());
        String responseData = streamReader.ReadToEnd();

        var track = JsonConvert.DeserializeObject<TrackModel>(responseData).;

        return track;
    }

希望你能帮助我,

非常感谢!

【问题讨论】:

  • 并尝试 webclient.downloadstring
  • 请也发布您的“TrackModel”。
  • @marcelion 嗨,好的,我刚刚在答案中发布了它:)
  • @Breakermind 我正在看这篇文章,谢谢,希望对我有帮助:)

标签: c# asp.net json get


【解决方案1】:

将您的TrackModel 分解为两个属性,并为Result 创建一个单独的类。

public class TrackModel
{
    [JsonProperty(PropertyName = "headers")]
    public Headers Headers { get; set; }
    [JsonProperty(PropertyName = "results")]
    public Result[] Results { get; set; }
}

public class Headers
{
    [JsonProperty(PropertyName = "status")]
    public string Status { get; set; }
    [JsonProperty(PropertyName = "code")]
    public string Code { get; set; }
    [JsonProperty(PropertyName = "error_message")]
    public string Errormessage { get; set; }
    [JsonProperty(PropertyName = "warnings")]
    public string Warnings { get; set; }
    [JsonProperty(PropertyName = "results_count")]
    public string ResultsCount { get; set; }
}

public class Result
{
    public string Id { get; set; }
    public string Name { get; set; }
    public int Duration { get; set; }
    [JsonProperty(PropertyName = "artist_id")]
    public string ArtistId { get; set; }
    [JsonProperty(PropertyName = "artist_name")]
    public string ArtistName { get; set; }
    [JsonProperty(PropertyName = "artist_idstr")]
    public string ArtistIdstr { get; set; }
    [JsonProperty(PropertyName = "album_name")]
    public string AlbumName { get; set; }
    [JsonProperty(PropertyName = "album_id")]
    public string AlbumId { get; set; }
    [JsonProperty(PropertyName = "license_ccurl")]
    public string LicenseCcurl { get; set; }
    public int Position { get; set; }
    public string Releasedate { get; set; }
    [JsonProperty(PropertyName = "album_image")]
    public string AlbumImage { get; set; }
    public string Audio { get; set; }
    public string Audiodownload { get; set; }
    public string Prourl { get; set; }
    public string Shorturl { get; set; }
    public string Shareurl { get; set; }
    public string Image { get; set; }
}

在你原来的方法中使用

var track = JsonConvert.DeserializeObject&lt;TrackModel&gt;(responseData).results[0].album_id;

【讨论】:

    【解决方案2】:

    您尝试反序列化子对象。那是行不通的,因为 JSON 序列化程序不知道 TrackModel 从哪里开始以及在哪里结束。添加一个包含结果列表的“父模型”。例如:

    public class TopModel {
        public ICollection<TrackModel> Results {get; set; }
     }
    

    然后使用那个模型:

    var model = JsonConvert.DeserializeObject<TrackModel>(responseData).;
    

    顺便说一句:我也会在你的 C# 文件中使用 Pascal 大小写。 JSON 序列化程序将负责大小写映射。

    顺便说一句 2:在您的流周围添加一些“使用”。

    【讨论】:

      【解决方案3】:

      您需要创建类似于 JSON 响应的 TrackModel。

      public class TrackModel 
      {
          [JsonProperty(PropertyName="headers")] 
          public Headers headers {get;set;}
      
      
          [JsonProperty(PropertyName="results")] 
          public List<Results> results {get;set;}
      }
      
      
      public class Headers {
          public string status {get;set;}
          public string code {get;set;}
          public string error_message {get;set;}
      //Rest of the properties
      }
      
      public class Results {
          public int id {get;set;}
          public string name {get;set;}
      // Rest of the properties
      }
      

      这里是小提琴:https://dotnetfiddle.net/Vr27pB

      【讨论】:

        【解决方案4】:

        如果您尝试将该字符串反序列化为您编写的类定义的对象,它将永远无法工作。因为您的 TrackModel 不匹配字符串,而只匹配它的内部部分。

        像这样创建一个包装类:

        public class TrackModelWrapper
        {
            public Headers Headers { get; set; }
            public IEnumerable<TrackModel> Results { get; set; }
        }
        
        public class Headers
        {
            public string Status { get; set; }
            public int Code { get; set; }
            public string Error_message { get; set; }
            public string Warnings { get; set; }
        
            public int Results_count { get; set; }
        }
        
        public class TrackModel
        {
            public string id { get; set; }
            public string name { get; set; }
            public int duration { get; set; }
            public string artist_id { get; set; }
            public string artist_name { get; set; }
            public string artist_idstr { get; set; }
            public string album_name { get; set; }
            public string album_id { get; set; }
            public string license_ccurl { get; set; }
            public int position { get; set; }
            public string releasedate { get; set; }
            public string album_image { get; set; }
            public string audio { get; set; }
            public string audiodownload { get; set; }
            public string prourl { get; set; }
            public string shorturl { get; set; }
            public string shareurl { get; set; }
            public string image { get; set; }
        }
        

        那就叫它:var track = JsonConvert.DeserializeObject&lt;TrackModelWrapper&gt;(responseData);

        【讨论】:

          猜你喜欢
          • 2018-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-30
          • 1970-01-01
          • 2018-11-02
          • 1970-01-01
          • 2023-03-24
          相关资源
          最近更新 更多