Ich verwende Volley
in meinem Projekt für die Bearbeitung von Netzwerkanforderungen. Hier ist ein Beispiel JSON
mein Server gibt
JSON-Objektantwort
%Vor%JSON-Array-Antwort
%Vor%Wenn ein Validierungsfehler oder ein anderer Fehler auftritt, gibt der Server folgende Antwort zurück:
%Vor% Das Problem liegt beim Parsen von Daten. Wenn die Anfrage erfolgreich ist, bekomme ich in onResponse
von ResponseListener
einfach den Inhalt von data
key. Wobei, ich erwartete das Ergebnis genauso wie das, was ich oben gepostet habe. Ich verstehe nicht, warum Volley
nur den Inhalt von data
zurückgibt und nicht den Wert von JSON
. Ich hatte Volley
früher auch benutzt. Aber solche Probleme gab es nie.
Parsing-Code:
%Vor%Antwort auf Erfolg:
%Vor% In onResponse
von ResponseListener
, bekomme ich diese Daten:
Wenn ein Fehler auftritt, gibt der Server diese Antwort zurück:
%Vor% Aus diesem Grund wirft Volley
ParseException
so wie es JSONArray
erwartet. Ich muss die Fehlermeldung dem Benutzer zeigen. Früher habe ich AsyncTask
benutzt und den Fehler dort behandelt. Aber mit Volley
stehe ich vor Schwierigkeiten. Ich habe in VolleyError
gesucht, aber keine Ahnung.
Update 1
%Vor% Aktualisieren
Bei diesem Problem ging es nicht um Volley
. Auf dem Server gab es ein Problem mit der gzip-Komprimierung. Ich werde für das Schließen dieser Frage stimmen.
Aber wenn ein Fehler auftritt, erhalte ich eine Parse-Ausnahme, wenn ich eine Anfrage mache für JSONArray
Verwenden Sie JSONObject. has () und JSONObject. isNull () , um vor der Analyse von json zu prüfen, welcher Schlüssel in der json-Antwort vorhanden ist.
Zum Beispiel:
%Vor% Im Falle eines Fehlers sollte Ihr Server den Fehler json mit dem HTTP-Statuscode 4xx zurückgeben. So entwerfen Sie Restful APIs. In der aktuellen Situation gibt Ihre API immer 2xx zurück, was dem erfolgreichen API-Ergebnis entspricht.
Wenn Ihre API den korrekten HTTP-Antwortcode sendet, in diesem Fall 401 (nicht autorisiert) oder 403 (verboten) Verweise hier und dein ErrorListener
wird von Volley aufgerufen. Sie müssen keine Parsing-Logik für die Fehlerreaktion in ResponseListener
schreiben. Hier ist eine gute Ressource zum Verständnis der http-Statuscodes von Rest API.
Eine effiziente Methode zur Handhabung dieser Situation kann durch Analysieren von JSON-Werten mit GSON und Zuweisen der Schlüsselwerte mithilfe der POJO-Klasse erreicht werden.
Beispiel:
Fügen Sie ein Fehlerszenario in beiden Fällen wie JSONArray oder JSONObject hinzu. Finden Sie die Muster Ihres POJO für Ihre Testdaten wie folgt:
Beispiel 1
%Vor%Beispiel 2
%Vor%Erzeugen Sie GSON aus Ihrer Antwort und behandeln Sie sowohl das positive (Erfolg) als auch das negative (Fehler) Szenario wie folgt:
%Vor%// Umwandlung der JSON-Antwort in das GSON-Format
%Vor%Referenzlinks, die von JSON
in GSON analysiert werden sollenHinweis: Um die GSON-Bibliothek in Android zu verwenden.
Fügen Sie folgende Zeilen in Großbuchstaben hinzu:
%Vor%Sie können den Wert des Codeschlüssels überprüfen, da er Ihnen immer zur Verfügung steht, ob die Antwort ein Fehler oder Erfolg sein würde. Unten ist ein kleiner Ausschnitt:
%Vor%Hinweis: Eine eher modulare Möglichkeit besteht darin, eine Modellklasse zu erstellen und darin Werte festzulegen. Auf diese Weise erhalten Sie alle Ihre Werte in einem einzigen Java-Objekt.
Vielleicht können Sie das versuchen:
Verwenden Sie die fastjson-Bibliothek, um Ihre json-Zeichenkette wie folgt in Ihr Java-Objekt in Response.Listener zu konvertieren:
Pojo pojo = JSON.parseObject(response.toString(), Pojo.class);
Und dein Pojo mag das mögen:
%Vor% Dann müssen Sie überprüfen, ob Ihr Pojo einen Wert wie einen Fehler hat. Wenn der Fehler nicht null ist, müssen Sie damit umgehen.
Die fastjson-Bibliothek hilft Ihnen, einen Absturz während der Konvertierung zu vermeiden.
Sie finden fastjson hier
Tags und Links android json android-volley