2012-07-16 22 views
10

Aşağıdaki kod boş json nesne taşıma. Ve bu kodu çalıştırdığımda aşağıdaki özel durum alırım: 'System.Collections.Generic.IDictionary`2 [System.String, System.Object]' yazmanız için 'RestSharp.JsonArray' türünde nesne dönüştürülemiyor.nazikçe RestSharp

Bunu incelikle halletmenin bir yolu var mı?

+0

Yanıtın sunucudan ne olduğunu değiştirme şansınız var mı? Boş bir dizi yerine [} boş bir nesne {} döndürmüş olmalı. İkisi de JSON'da uyumlu değildir. –

+0

Basit korsanları düşünebilirim ama bununla ilgili. – evanmcdonnal

+0

@Thomas: Bunun hakkında daha fazla düşüncesi olan var mı? Cevap buldun mu? Bunu Facebook API'sından alıyorum. Belirli bir çağrıda, bazı geçersiz veriler gönderdiğinizde, neyin yanlış olduğunu ve neden olduğunu söyleyen bir sözlük döndürür. Aksi halde boş bir json dizisi döner [] '. Çok can sıkıcı. Fikirler? – xan

cevap

0

İstemciye hiç gerek duymadım.AddHandler satırı, bu yüzden buna ihtiyacınız olduğundan emin değilim. Bunu Execute yönteminiz için deneyin:

public T Execute<T>(RestRequest request) where T : class, new() 
{ 
    RestClient client = new RestClient(baseUrl); 
    client.AddHandler("text/plain", new JsonDeserializer()); 

    try 
    { 
     var response = client.Execute<T>(request); 
     return response.Data; 
    } 
    catch (Exception ex) 
    { 
     // This is ugly, but if you don't want to bury any errors except when trying to deserialize an empty array to a dictionary... 
     if (ex is InvalidCastException && typeof(T) == typeof(Dictionary<string, MyObject>)) 
     { 
      // Log the exception? 
      return new T(); 
     } 

     throw; 
    } 
} 
+0

Bu sorunun yanıtlanmasına yardımcı olduğundan emin değilsiniz - evet istisnaların yayılmasını önlemek için iyi bir geri dönüş olabilir, ancak sorun, API'nin tutarsız olması. Bununla ilgilenmek için RestSharp'i nasıl yapılandıracağınız ile ilgili herhangi bir düşünceniz var mıdır? – xan

+0

@xan - Cevabımı biraz düzenledim. Bu cevap, OP'nin sunduğu problemi elle çözmek için bir yoldur. Problemin RestSharp'ta bir hata/eksiklik olduğunu düşünüyorum ve bunu halledebilmek için RestSharp'ı yapılandırmanın bir yolunu bilmiyorum. – jfren484

4

Benzer bir sorunu kendim takip ettim. Özel serileştiriciler kullanmayı denedim (çünkü karmaşık bir nesneyi seri hale getirdiğimden), ancak sonuçta yaptığım çok sayıda istekten birine uygulandığından, aşağıdakiler çok daha kolaydı.

request.OnBeforeDeserialization = (x => 
{ 
    x.Content = x.Content.Replace("[]", "{}"); 
}); 

Bu özel bir talep durumunda istek nesne inşa edildi

, I {} ile yanlış [] yerine bir geri ayarlamak için OnBeforeDeserialization özelliği kullanılır. Bu benim için çalışıyor çünkü ben x.Content geri kalanında geri alıyorum veriler biliyorum bile bu özel durumda, değerlerde bile hiçbir zaman [] içermeyecektir.

Bu, bir başkasına yardımcı olabilir, ancak kesinlikle dikkatli kullanılmalıdır.

+0

Teşekkürler xan! Benim kodum [biraz farklı] (https://gist.github.com/koreus7/b1be123762aea29b6362) ama sadece RestSharp 105.0.1.0 ile test ettim ve işe yaradı. Biraz şaşırdım RestSharp bununla ilgilenmiyor. GitGub hakkında rapor vermeyi düşünüyor musunuz? – koreus737

+0

"OnBeforeDeserialization" eklentisini, istek fabrikamdaki tüm isteklerim için yalnızca bir kez yapmak zorunda olduğum anlamına gelir. Bu hata bir günden fazla bir süredir beni delirtiyordu - sonuçta bizim isteğimiz dizide sonuç döndürmediği sonucuna varmamıştık, böylece hatayı daha önce görmemiştik. Bir * bit * hacky ve kirli hissediyor ama bununla başa çıkmak için daha iyi bir yol yok gibi görünüyordu ve biz de seri hale getiriciyi değiştirmek zorunda kalmak istemedik. –

İlgili konular