2012-12-05 8 views
6

Tôi rất mới làm việc với JSON và đang xử lý sự trở lại từ một API mà tôi không thể thay đổi định dạng. Ví dụ về trả lại là: (url thực tế đã bị xóa)Deserializing JSON với mảng được lập chỉ mục trong C#

{ 
"body": 
    { 
    "link": 
     {"linkurl": ["www.google.com"]} 
    }, 
"error": null, 
"message": "Data Retrieved successfully", 
"status": true 
} 

Tôi đang sử dụng thư viện Newtonsoft.Json với MVC 3, trong VS2010.

lớp của tôi là:

[JsonObject(MemberSerialization.OptIn)] 
    public class LinksJSON 
    { 
     [JsonProperty] 
     public string link{ get; set; } 

     [JsonProperty] 
     public string message { get; set; } 

     [JsonProperty] 
     public string error { get; set; } 

     [JsonProperty] 
     public bool status { get; set; } 
    } 

Tôi deserializing nó với:

private static T _download_serialized_json_data<T>(string url) where T : new() 
    { 
     using (var w = new WebClient()) 
     { 
      var json_data = string.Empty; 
      // attempt to download JSON data as a string 
      try 
      { 
       json_data = w.DownloadString(url); 
      } 
      catch (Exception) { } 
      // if string with JSON data is not empty, deserialize it to class and return its instance 
      return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T(); 
     } 
    } 

    public string CheckJSONLink() 
    { 

     var url = "<api url-removed for security>"; 

     var outObj = _download_serialized_json_data<LinksJSON>(url); 



     return outObj.Link; 
    } 

Tuy nhiên tôi đang cố gắng để có được giá trị của linkurl, đó là một mảng được lập chỉ mục trong vòng Link.

Tôi làm cách nào để truy cập thông tin này?

+0

btw, tôi có thể truy cập vào tất cả các lĩnh vực khác (lỗi, thông điệp và tình trạng không có vấn đề). – Crossems

Trả lời

1

Bạn nên sử dụng các loại sau đây:

[JsonObject(MemberSerialization.OptIn)] 
public class LinksJSON 
{ 
    [JsonProperty] 
    public body body { get; set; } 

    [JsonProperty] 
    public string message { get; set; } 

    [JsonProperty] 
    public string error { get; set; } 

    [JsonProperty] 
    public bool status { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class body 
{ 
    [JsonProperty] 
    public link link { get; set; } 
} 

[JsonObject(MemberSerialization.OptIn)] 
public class link 
{ 
    [JsonProperty] 
    public string[] linkurl { get; set; } 
} 
+0

Đây là những gì tôi đã kết thúc thực hiện: tương tự như trên [JSONObject (MemberSerialization.OptIn)] public class LinksJSON { [JsonProperty] bodylinkdetails công cơ thể; [JsonProperty] trạng thái bool công khai; [JsonProperty] thông báo chuỗi công khai; [JsonProperty] lỗi chuỗi công khai; } lớp vỏ bọc thông tin công khai { liên kết liên kết công khai; } liên kết lớp công khai { chuỗi công khai [] linkurl; } – Crossems

2

Bạn không thiết lập lớp học của mình để khớp với JSON, lớp của bạn nói rằng link là một chuỗi đơn giản, ví dụ của bạn cho thấy nó là một loại phức tạp.

Để giải mã đúng cách như bạn mong đợi, bạn sẽ phải sửa đổi lớp học của mình để khớp với JSON. Cụ thể, link phải là một phiên bản của một lớp.

+0

Cảm ơn câu trả lời này là tốt, vì nó nhắc các cuộc thảo luận với nhóm của họ để có được cấu trúc lớp thích hợp để deserialize. – Crossems