2013-04-22 45 views
12

Tôi có một phản ứng JSON mà tôi đang cố gắng để deserialize với RestSharp, và nó trông như thế này:RestSharp Deserialization với JSON Mảng

{"devices":[{"device":{"id":7,"deviceid":"abc123","name":"Name"}}, 
      {"device":{"id":1,"deviceid":"def456","name":"Name"}}], 
"total":2, 
"start":0, 
"count":2} 

Dựa tắt của một số gợi ý tôi đã tìm thấy, tôi đã cố gắng để thiết lập POCO của tôi như thế này:

public class DevicesList 
{ 
    public List<DeviceContainer> Devices; 
} 

public class DeviceContainer 
{ 
    public Device Device; 
} 

public class Device 
{ 
    public int Id { get; set; } 
    public string DeviceId { get; set; } 
    public string Name { get; set; } 
} 

Và sau đó thực hiện của tôi trông như thế này:

// execute the request 
var response = client.Execute<DevicesList>(request); 

Hồ wever, response.Data là NULL và tôi đã thử các biến thể khác không có may mắn.

Vì vậy, cấu trúc lớp và ánh xạ nào nên được sử dụng cho trường hợp này? Tôi cũng đã thử điều này mà không cần thêm lớp DeviceContainer.

Cảm ơn sự giúp đỡ.

+0

Có thể bạn nên thêm tổng, bắt đầu và đếm tính để deviceslist lớp. – Vladimir

Trả lời

16

RestSharp chỉ hoạt động trên tài sản, nó không deserialize các lĩnh vực, do đó hãy chắc chắn để chuyển đổi DevicesDevice bạn trường để tài sản.

Ngoài ra, hãy kiểm tra lại số Content-Type của phản hồi, nếu câu trả lời là cái gì đó không mặc định, RestSharp có thể không sử dụng JsonDeserializer. Xem câu trả lời của tôi trên RestSharp client returns all properties as null when deserializing JSON response

+0

Đó là nó. Sai lầm ngu ngốc quên '{get; bộ; } '. Khi tôi thêm vào, nó hoạt động hoàn hảo. Cảm ơn! –

2

RestShartp không hỗ trợ DataAnnotation/DataMember, đổi tên các thuộc tính của bạn mà không maj:

  • Devices -> Thiết bị
  • Device -> Thiết bị

VÀ đừng quên các {get; set;} ;).

21

Tôi đã có một vấn đề hơi khác nhau khi POCO deserialization của tôi chứa một mảng ..

Thay đổi nó Devices[]-List<Devices> giải quyết vấn đề và nó deserialized một cách chính xác.

+0

cảm ơn bạn, chỉ cần nhấn với điều này và sửa chữa của bạn giải quyết nó – mahonya

+3

'IEnumerable <>' và 'IList <>' không hoạt động. Bạn cần 'Danh sách <>' –

3

Điều gì đó mà tôi gặp phải là nó không hoạt động nếu bạn sử dụng các giao diện như: IEnumerable hoặc IList, nó phải là một loại cụ thể.

Điều này sẽ không hoạt động, ở đâu đối với một số trình tuần tự json khác như json.net.

public class DevicesList 
{ 
    public IEnumerable<DeviceContainer> Devices { get; set; } 
} 

public class DeviceContainer 
{ 
    ... 
} 

nó sẽ phải là cái gì đó như thế này:

public class DevicesList 
{ 
    public List<DeviceContainer> Devices { get; set; } 
} 

public class DeviceContainer 
{ 
    ... 
} 
+0

Điều này sẽ giúp ích nếu bạn đang sử dụng phiên bản RESTSharp mới hơn (ví dụ: không sử dụng JSON.NET) cho JsonDeserializer của bạn – Skyguard