Sometimes that API you are given just doesn't conform to what you are expecting.java
I have had to consume a JSON API recently where the JSON returned "{}" instead of null or not at all.json
For example, this is OK:ide
{ "name": "Chris", "inner": null }
Ommitting the inner field also OK:ui
{ "name": "Chris" }
But this is plain difficult:this
{ "name": "Chris", "inner": {} }
For what ever reasons I want inner to parse to null.google
This will parse empty JSON objects ({})
to null. Hope it helps!code
The following snippet will use a new TypeAdapterFactory from GSON 2.2+.orm
/** * Created by Chris on 22/02/15. */ public class EmptyCheckTypeAdapterFactory implements TypeAdapterFactory { @Override public <T> TypeAdapter<T> create(final Gson gson, final TypeToken<T> type) { // We filter out the EmptyCheckTypeAdapter as we need to check this for emptiness! if (InnerObject.class.isAssignableFrom(type.getRawType())) { final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type); final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class); return new EmptyCheckTypeAdapter<>(delegate, elementAdapter).nullSafe(); } return null; } public static class EmptyCheckTypeAdapter<T> extends TypeAdapter<T> { private final TypeAdapter<T> delegate; private final TypeAdapter<JsonElement> elementAdapter; public EmptyCheckTypeAdapter(final TypeAdapter<T> delegate, final TypeAdapter<JsonElement> elementAdapter) { this.delegate = delegate; this.elementAdapter = elementAdapter; } @Override public void write(final JsonWriter out, final T value) throws IOException { this.delegate.write(out, value); } @Override public T read(final JsonReader in) throws IOException { final JsonObject asJsonObject = elementAdapter.read(in).getAsJsonObject(); if (asJsonObject.entrySet().isEmpty()) return null; return this.delegate.fromJsonTree(asJsonObject); } } }
Then of course add this to your GSON Builder:ip
new GsonBuilder() .registerTypeAdapterFactory( new EmptyCheckTypeAdapterFactory()) .create();
Reference: google-gson/issues/detail/43element