2012-07-16 6 views
10

Ich habe den folgenden Code:Anmutig ein leeres Objekts in json RestSharp Handhabung

public void GetJson() 
{ 
    RestRequest request = new RestRequest(Method.GET); 

    var data = Execute<Dictionary<string, MyObject>>(request); 
} 

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

    var response = client.Execute<T>(request); 

    return response.Data; 
} 

Das Problem besteht darin, dass manchmal die Antwort wird ein leerer json Array [] sein. Und wenn ich diesen Code ausführe, erhalte ich die folgende Ausnahme: Das Objekt des Typs 'RestSharp.JsonArray' kann nicht in den Typ 'System.Collections.Generic.IDictionary`2 [System.String, System.Object]' umgewandelt werden.

Gibt es eine Möglichkeit, dies elegant zu handhaben?

+0

Haben Sie eine Chance zu ändern, was die Antwort vom Server ist? Es sollte Ihnen ein leeres Objekt {} anstelle eines leeren Arrays [] zurückgegeben haben. Die beiden sind nicht kompatibel in JSON. –

+0

Ich kann an einfache Hacks denken, aber das ist es. – evanmcdonnal

+0

@Thomas: Hat jemand noch mehr Gedanken dazu? Finden Sie Antworten? Ich bekomme das von der Facebook API. Wenn Sie bei einem bestimmten Aufruf ungültige Daten senden, wird ein Wörterbuch zurückgegeben, in dem Sie darüber informiert werden, was falsch ist und warum. Andernfalls wird ein leeres json-Array '[]' zurückgegeben. So nervig. Ideen? – xan

Antwort

0

Ich habe nie die client.AddHandler Zeile benötigt, also bin ich mir nicht sicher, ob Sie das brauchen. Versuchen Sie dies für Ihre Execute-Methode, aber:

+0

Nicht sicher, dass dies hilft, die Fragen zu beantworten - ja, es ist möglicherweise ein schönes Fallback zu verhindern, dass die Ausnahme propagiert, aber das Problem ist die API nicht konstant. Irgendwelche Gedanken darüber, wie man RestSharp damit umgehen kann oder wie man manuell umgeht? – xan

+0

@xan - Ich habe meine Antwort leicht bearbeitet. Diese Antwort ist eine Möglichkeit, das vom OP präsentierte Problem manuell zu umgehen. Ich denke, das Problem ist ein Fehler/Mangel in RestSharp und ich kenne keine Möglichkeit, RestSharp zu konfigurieren, damit umzugehen. – jfren484

4

Ich arbeitete um ein ähnliches Problem selbst in der folgenden Weise. Ich hatte versucht, benutzerdefinierte Deserialisierer zu verwenden (da ich zu einem komplexen Objekt deserialisiert wurde), aber am Ende war das Folgende viel einfacher, da es nur auf eine der vielen Arten von Anforderungen zutraf, die ich machte.

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

Wo ich das Request-Objekt für diese spezielle Anforderung konstruieren, nutzte ich die OnBeforeDeserialization Eigenschaft einen Rückruf zu setzen, die die falschen [] mit {} ersetzt. Das funktioniert für mich, weil ich weiß, dass die Daten, die ich im Rest von x.Content bekomme, niemals [] enthalten werden, außer in diesem Spezialfall, selbst in den Werten.

Dies könnte jemand anderem helfen, sollte aber auf jeden Fall mit Vorsicht verwendet werden.

+0

Danke Xan! Mein Code ist [etwas anders] (https://gist.github.com/koreus7/b1be123762aea29b6362), aber ich habe es gerade mit RestSharp 105.0.1.0 getestet und es hat funktioniert. Ich bin ein wenig überrascht RestSharp geht aber nicht damit um. Denkst du, dass es sich lohnt, über GitGub zu berichten? – koreus737

+0

Ich mag den Zusatz von 'OnBeforeDeserialization', da es bedeutet, dass ich dies nur einmal für alle meine Anfragen in meiner Anfragefabrik tun muss. Dieser Fehler hat mich für mehr als einen Tag in den Wahnsinn getrieben - es stellte sich heraus, dass wir einfach nicht die Situation getroffen hatten, in der unsere Anfrage keine Ergebnisse im Array lieferte, so dass wir den Fehler vorher nicht gesehen hatten. Es fühlt sich ein bisschen hacky und dreckig an, aber es schien keinen besseren Weg zu geben, dies zu handhaben und wir wollten den Deserializer nicht austauschen. –

Verwandte Themen