Вам потребуется зарегистрировать пользовательский TypeAdapter , который упаковывает существующий String TypeAdapter и заменяет пустые строки JSON null.
Пример кода:
public static void main(String[] args) {
Gson gson = createGson();
System.out.println(gson.toJson(Arrays.asList("foo","bar","",null,"phleem")));
}
static Gson createGson() {
return new GsonBuilder().serializeNulls()
.registerTypeAdapter(String.class,
new EmptyToNullTypeAdapter())
.create();
}
static class EmptyToNullTypeAdapter extends TypeAdapter<String> {
@Override
public void write(final JsonWriter out, final String value) throws IOException {
if (value.isEmpty()) {
out.nullValue();
} else {
TypeAdapters.STRING.write(out, value);
}
}
@Override
public String read(final JsonReader in) throws IOException {
return TypeAdapters.STRING.read(in);
}
}
Вывод:
["foo", "bar", null, null, "phleem"]
Предостережение
Наконец: не уверен, что это хорошая идея, потому что это асимметричное c решение, т.е. когда вы десериализуете объект, а затем сериализуете его снова, ваш новый объект выиграл ' не может быть равным исходному объекту (пустым вместо пустых строк).