2012-04-25 39 views
28

Tôi đang gặp một vấn đề với RestSharp deserializing nội dung trả về vào các lớp học của tôi. Từ tất cả các tìm kiếm của tôi có vẻ như tôi đang làm điều này một cách chính xác. Tôi sẽ sử dụng deserializer của RestSharp hơn là phải quay trở lại một gói khác như Json.NET của Newstonsoft.RestSharp không deserializing JSON Object List, luôn luôn Null

gì tôi đang làm là thực hiện một yêu cầu API để GoToWebinar cho tất cả các danh sách các hội thảo dự kiến:

var client = new RestClient(string.Format("https://api.citrixonline.com/G2W/rest/organizers/{0}/upcomingWebinars", "300000000000239000")); 
var request = new RestRequest(Method.GET); 
request.AddHeader("Authorization", "OAuth oauth_token=" + System.Configuration.ConfigurationManager.AppSettings["GoToWebinar"]); 
var response2 = client.Execute<List<RootObject>>(request); 

Như bạn thấy tôi muốn để có được một danh sách các đối tượng 'RootObject' (như hình dưới đây). Tôi nhận được phản ứng JSON sau trong response2.Content:

[ 
    { 
     "webinarKey":678470607, 
     "subject":"Easton's Wild Rice Cooking Demo", 
     "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", 
     "organizerKey":300000000000239551, 
     "times":[{"startTime":"2012-05-09T15:00:00Z","endTime":"2012-05-09T16:00:00Z"}], 
     "timeZone":"America/Denver" 
    }, 
    { 
     "webinarKey":690772063, 
     "subject":"Easton's Match Making Service", 
     "description":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", 
     "organizerKey":300000000000239551, 
     "times":[{"startTime":"2012-05-09T15:00:00Z","endTime":"2012-05-09T16:00:00Z"}], 
     "timeZone":"America/Denver" 
    } 
] 

Tôi tạo ra các đối tượng sau đây sử dụng http://json2csharp.com sử dụng kết quả JSON trên:

public class RootObject 
{ 
    public int webinarKey { get; set; } 
    public string subject { get; set; } 
    public string description { get; set; } 
    public long organizerKey { get; set; } 
    public List<Time> times { get; set; } 
    public string timeZone { get; set; } 
} 

public class Time 
{ 
    public string startTime { get; set; } 
    public string endTime { get; set; } 
} 

Vấn đề là response2.Data luôn là Null. Đối với một số lý do deserialization thất bại và tôi không biết tại sao. Mục tiêu của tôi là có thể sử dụng vòng lặp foreach để lặp qua các kết quả:

foreach(RootObject r in response2.Data) 
{ 
    lblGoToWebinar.Text += r.webinarKey.ToString() + ", "; 
} 

Bất kỳ ý tưởng nào về việc tại sao quá trình deserialization bị lỗi?

Cảm ơn bạn trước!

+2

Bạn có thể gỡ lỗi và xem đối tượng 'response2' để xem giá trị thô không? Bạn sẽ thấy nếu có lỗi với trình gỡ lỗi. – agarcian

+1

Cảm ơn bạn @agarcian! Dựa trên đề xuất của bạn, tôi bắt đầu tìm kiếm một số lỗi bên trong và tìm ra nó như được nhìn thấy trong câu trả lời của tôi bên dưới. –

+0

vui vì nó đã hoạt động! – agarcian

Trả lời

71

Dựa trên đề nghị các @ agarcian của trên, tôi googled lỗi:

restsharp Data at the root level is invalid. Line 1, position 1.

và thấy diễn đàn này: http://groups.google.com/group/restsharp/browse_thread/thread/ff28ddd9cd3dde4b

Về cơ bản, tôi đã sai khi cho rằng client.Execute đang xảy ra để có thể để tự động phát hiện loại nội dung trả về. Nó cần phải được giải thích:

var request = new RestRequest(Method.GET); 
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; }; 

Điều này có thể được trích dẫn rõ ràng hơn trong tài liệu của RestSharp. Hy vọng rằng điều này sẽ giúp người khác ra ngoài!

+2

Chỉ định 'Method.GET' là thừa, phải không? (Đó là kiểu phương thức mặc định) – ashes999

+0

@ ashes999, đã đồng ý. –

+3

Theo chủ đề, cách tiếp cận được đề xuất là: 'client.AddHandler (" văn bản/đồng bằng ", mới JsonDeserializer())', điều này thực sự phải ở trong tài liệu – Rowan

1

Kết thúc buổi tiệc: Bạn cần tìm số thực tế Loại nội dung của phản hồi bạn nhận được. Máy chủ không nhất thiết phải phản hồi với bất kỳ loại nội dung nào từ tiêu đề Chấp nhận của yêu cầu của bạn. Đối với các API của Google, tôi nhận được phản hồi bằng văn bản/đơn giản, vì vậy, advice from the group này đã hoạt động đối với tôi.

public T Execute<T>(string url, RestRequest request) where T : new() 
{ 
    var client = new RestClient(); 
    // tell RestSharp to decode JSON for APIs that return "Content-Type: text/plain" 
    client.AddHandler("text/plain", new JsonDeserializer()); 
    ... 

Nó cũng ngăn nắp nếu nó có thể được thực hiện ở một nơi như chia sẻ Execute phương pháp trên, thay vì buộc loại phản ứng với bất cứ nơi nào OnBeforeDeserialization mỗi yêu cầu được tạo ra.

Các vấn đề liên quan