Vorwort
In tatsächlichen Entwicklungsprojekten verwendet der Server häufig die leere Zeichenfolge "" als Rückgabeergebnis, um den leeren Wert darzustellen, dies wird jedoch auf Probleme in GSON stoßen. Wenn der Typ dieser Daten keine Zeichenfolge ist, meldet GSON beim Parsen einen Fehler.
JSON -Ausnahme
Schauen wir uns zuerst einen JSON an, der im Hintergrund zurückgekehrt ist
Unter normalen Umständen JSON:
{"Code": 0, "msg": "OK", "Daten": {"ID": 5638, "NewSID": 5638}}Die Entitätsklasse entspricht dem Datenteil:
public class jsonbean {private int id; Private int NewsID; public int getid () {return id; } public void setId (int id) {this.id = id; } public int getNewsid () {return NewsID; } public void setNewsid (int newSID) {this.newsid = newID; }}Ausnahme JSON (die entsprechenden Daten finden Sie im Feld des Hintergrunddatenbanks nicht):
{"Code": 0, "msg": "OK", "Daten": {"ID": 5638, "NewSID": ""}}Auf diese Weise wird GSON beim Parsen eine Ausnahme mit analysierenden Fehlern auswerfen, und die App stürzt ab, da sie "" in int nicht konvertieren kann
Umgang mit JSON -Ausnahmen
Wir gehen davon aus, dass der entsprechende Nullwert in den Standardwert konvertiert wird, wenn die im Hintergrund zurückgegebene JSON -Ausnahme erfolgreich analysiert werden kann, wie z. newsId=0;
Hier schließen wir die Korrekturen für Sie aus, wenn die Hintergrundentwickler ausgeben, müssen wir uns noch auf uns selbst verlassen.
Wir schreiben einen Typkonverter für int -Werte, der JsonSerializer<T> -Schinschnittstelle von GSON und JsonDeserializer<T> implementieren muss, dh Serialisierung und Deserialisierungsschnittstellen
öffentliche Klasse IntegerDefault0Adapter implementiert JsonSerializer <Geverseger>, jSondesserializer <Integer> {@Override public Integer Deserialize (JsonElement JSON, Type Typoft, JSonderializationContext -Kontext) löst JsonParseException ("{ifStastring (JSON.GETASTRING" (JSON.GETASTRING (JSON.GEBEN). json.getassstring (). Equals ("null")) {// als int type definieren, wenn der Hintergrund zurückgibt "" oder null, return 0; }} catch (Ausnahme ignorieren) {} try {return json.getasint (); } catch (numberFormatexception e) {throw New JsonSyntaxException (e); }} @Override public JsonElement Serialize (Integer SRC, Typ TypeOfSRC, JsonSerializationContext Context) {return New JsonPrimitive (SRC); }} Ebenso lange und doppelte Typen
double =>
Public Class DoubleDefault0Adapter implementiert JsonSerializer <Double>, JSondesserializer <Double> {@Override Public Double Deerialize (JsonElement JSON, Typtyp, JSondesSerializationContext -Kontext) wirft JsonParseException {try {if (json.getassstring (). json.getassstring (). Equals ("null")) {// als Doppeltyp definieren, wenn der Hintergrund zurückgibt "" oder null, return 0,00 return 0,00; }} catch (Ausnahme ignorieren) {} try {return json.getasDouble (); } catch (numberFormatexception e) {throw New JsonSyntaxException (e); }} @Override public JSonElement Serialize (Double SRC, Typ TypeOFSRC, JsonSerializationContext -Kontext) {return New JsonPrimitive (SRC); }}lang =>
öffentliche Klasse longdefault0Adapter implementiert JsonSerializer <Long>, JSondesserializer <Long> {@Override Public Long Deserialize (JsonElement JSON, Typtyp, JSondesSerializationContext -Kontext) wirft JsonParseException {try {if (json.getassstring (). json.getassstring (). Equals ("null")) {// so lange Typ definieren, wenn der Hintergrund zurückgibt "" oder null, return 0l; }} catch (Ausnahme ignorieren) {} try {return json.getaslong (); } catch (numberFormatexception e) {throw New JsonSyntaxException (e); }} @Override public JSonElement Serialize (Long SRC, Typ typeofsrc, JsonSerializationContext -Kontext) {return New JsonPrimitive (SRC); }}Die Verwendung ist also wie folgt:
return New Retrofit.builder () .Client (Okhttpclient) // Network Access Framework. RxJava.baseUrl(baseUrl) .build();/** * Add the processing of "" and "null" in the background* 1.int=>0 * 2.double=>0.00 * 3.long=>0L * * @return */public static Gson buildGson() { if (gson == null) { gson = new GsonBuilder() .RegisterTypeadapter (Integer.Class, New IntegerDefault0Adapter ()) .registerTypeadapter (int.Class, New IntegerDefault0Adapter () .registerTypeadapter (double.class, New DoubledEfault0Adapter () .RegisterTypeadapter (Long.class, New LongDefault0Adapter (). RegisterTypter (Long.class), New LongDefault0Adapter () .RegisterTypter (Long. .registerTypeadapter (long.class, new longDefault0Adapter ()) .create (); } return gson;}Wird niemals abstürzen, weil das Hintergrund -JSON -Feld wieder leer ist
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, der Inhalt dieses Artikels wird für das Studium oder die Arbeit aller hilfreich sein. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.