2017-02-22 5 views
3

Ich verwende Gson zum Serialisieren und Deserialisieren von JSON. In meinen Tests habe ich festgestellt, dass, wenn ich mein Gson Objekt eine leere Zeichenfolge übergebe, es null zurückgibt, anstatt eine JsonParseException zu werfen.Verhindern, dass Gson bei der Deserialisierung leerer Zeichenfolgen null zurückgibt

Wie kann ich Gson so konfigurieren, dass es einen Fehler für leere Zeichenfolgen ausgibt?


Hier ist mein Deserializer:

public final class ProjectDeserializer implements JsonDeserializer<Project> { 

    @Override 
    public Project deserialize(final JsonElement jsonElement, final Type type, final JsonDeserializationContext context) throws JsonParseException { 

     final JsonObject jsonObject = jsonElement.getAsJsonObject(); 

     final Identifier name = context.deserialize(jsonObject.get("name"), Identifier.class); 

     Optional<String> license; 
     if (jsonObject.has("license")) { 
      license = Optional.of(jsonObject.get("license").getAsString()); 
     } else { 
      license = Optional.empty(); 
     } 

     DependencyGroup dependencies; 
     if (jsonObject.has("dependencies")) { 
      dependencies = context.deserialize(jsonObject.get("dependencies"), DependencyGroup.class); 
     } else { 
      dependencies = DependencyGroup.of(); 
     } 

     return Project.of(name, license, dependencies); 
    } 
} 

Hier ist meine Gson Fabrik:

public static Gson gson() { 

    final GsonBuilder gsonBuilder = new GsonBuilder(); 

    // etc... 

    gsonBuilder.registerTypeAdapter(Project.class, new ProjectSerializer()); 
    gsonBuilder.registerTypeAdapter(Project.class, new ProjectDeserializer()); 

    // etc... 

    return gsonBuilder.create(); 
} 

Antwort

1

Sie können es nicht so aus der Box machen. Derzeit com.google.gson.Gson hat den folgenden Code-Schutzcode:

public <T> T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException { 
    boolean isEmpty = true; 
    ... 
    try { 
     reader.peek(); 
     ... 
    } catch (EOFException e) { 
     /* 
     * For compatibility with JSON 1.5 and earlier, we return null for empty 
     * documents instead of throwing. 
     */ 
     if (isEmpty) { 
     return null; 
     } 
     throw new JsonSyntaxException(e); 

Passing eine leere oder eine leere Zeichenfolge an die Methode die reader.peek(); Linie macht zu werfen ist eine EOFException und die isEmpty Flag auf true in diesem Augenblick. Aus diesem Grund hat Ihr Deserializer keine Auswirkungen: Es wird nicht einmal aufgerufen. Dieses Verhalten in Commit eingeführt wurde 25c6ae177b1ca56db7f3c29eb574bdd032a06165back in 2011 mit dem Nachrichtenauszug folgenden begehen:

Gründen der Abwärtskompatibilität null zurück für die leere Zeichenkette.

Was Sie tun können, entweder sorgt dafür, dass Sie deserialisiert Objekte für null überprüfen, oder (wenn zentralisiert Deserialisierung ist möglich, dass Sie [zumindest sollte es sein]) stellen Sie sicher, dass Gson.fromJson(JsonReader,Type) für Deserialisierung Zwecke verwendet wird: diese Hier können Sie einen benutzerdefinierten JsonReader Wrapping EOFException s in JsonSyntaxException s, die derzeit nicht in dieser Methode gefangen sind (mindestens wie von Gson 2.8.0). Zum Beispiel:

Dies würde den Schutzcode in Gson brechen. Ein paar Beispiele unten. Der Code, der nicht scheitern:

gson.fromJson("", fooType); 
gson.fromJson(new StringReader(""), fooType); 

Aber das folgende tut:

gson.fromJson(new EmptyStringFailFastJsonReader(new StringReader("")), fooType); 

mit Ausnahme der folgenden Nachricht:

com.google.gson.JsonSyntaxException: java.io .EOFException: Ende der Eingabe in Zeile 1 Spalte 1 Pfad $

+0

Danke für die ausführliche Antwort. Ich denke, die beste Lösung für mein Projekt ist, statische Methoden für jeden Typ zu haben, die ich deserialisieren könnte, und die Überprüfung dort durchzuführen. – sdgfsdh

+0

@sdgfsdh Gern geschehen. –

Verwandte Themen