2012-04-25 16 views
28

RestSharp ile dönüş içeriğinin sınıflarıma serpiştirilmesi konusunda bir sorun yaşıyorum. Tüm aramalarımdan, bunu doğru bir şekilde yapıyorum gibi görünüyor. NewsSoft'un Json.NET'i gibi başka bir pakete geri dönmek zorunda kalmaktan çok, RestSharp'ın serpantini kullanıyorum.RestSharp JSON Nesne Listesini ayırma, her zaman Null

Ne planlanan Webinars tüm listesi için GoToWebinar bir API istekte bulunuyor yapıyorum:

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

Sana (aşağıda gösterildiği gibi) nesnesi 'RootObject' listesini almak istiyorum Gördüğünüz gibi. Ben response2.Content aşağıdaki JSON yanıtını alıyorum:

[ 
    { 
     "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" 
    } 
] 

Yukarıda JSON sonuçlarını kullanarak http://json2csharp.com kullanarak aşağıdaki nesneler yarattı:

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

sorun response2.Data hep boş olmasıdır. Bir nedenden ötürü serileşme başarısız oldu ve nedenini bilmiyorum. neden deserialization başarısız üzerinde

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

Herhangi bir fikir: Amacım sonuçları yineleme yapmak için bir foreach döngü kullanmak mümkün olmaktır?

şimdiden teşekkür ederiz! @ Agarcian önerisine dayanarak

+2

Ham değerin ne olduğunu görmek için 'response2' nesnesine hata ayıklayıp bakabilir misiniz? Hata ayıklayıcısında bir hata olup olmadığını görmelisiniz. – agarcian

+1

Teşekkür ederim @agarcian! Önerilerinize dayanarak bazı iç hataları aramaya başladım ve aşağıda cevabımda görüldüğü gibi anladım. –

+0

işe yaradığı için memnunum !!! – agarcian

cevap

71

yukarıda, ben hata googled:

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

ve bu forumu buldum: Temelde http://groups.google.com/group/restsharp/browse_thread/thread/ff28ddd9cd3dde4b

, ben client.Execute mümkün olacaktı varsaymak yanlış olduğunu iade içerik türünü otomatik olarak algılamak için Bu explicity ayarlanması gerekir: Bu RestSharp belgelerinde daha net atıf olabilir

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

. Umarım bu başka birine yardımcı olur!

+2

'Method.GET' belirtilmesi gereksizdir, değil mi? (Bu varsayılan yöntem türü) – ashes999

+0

@ ashes999, kabul etti. –

+3

İş parçacığına göre önerilen yaklaşım: client.AddHandler ("text/plain", yeni JsonDeserializer()) ', bu gerçekten belgede olmalıdır – Rowan

1

Partiye geç geldiyse: Aldığınız yanıtın gerçek İçerik Türü'nü bulmanız gerekir. Sunucu, isteğinizin Accept üstbilgisinden gelen içerik türlerinden hiçbiriyle yanıt vermez. Google'ın API'ları için bir metin/düz yanıt aldım, bu yüzden bu advice from the group benim için çalıştı. Böyle ziyade her istek oluşturulur yerde OnBeforeDeserialization ile yanıt türünü zorlayarak yerine, yukarıdaki yöntemi Yürütme paylaşılan olarak tek bir yerde yapılabilir eğer

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()); 
    ... 

Ayrıca Sessizleştirme bu.

İlgili konular