gson: считать ноль пустой строкой - PullRequest
29 голосов
/ 28 февраля 2012

Я использую google-gson для сериализации карты Java в строку JSON. Он обеспечивает , а строитель обрабатывает нулевые значения :

Gson gson = new GsonBuilder().serializeNulls().create();

Проблема в том, что результатом является строка null, например:

gson.toJson(categoriesMap));
{"111111111":null}

И требуемый результат:

{"111111111":""}

Я могу сделать String-replace для null и "", но это безобразно и подвержено ошибкам. Есть ли встроенная поддержка gson для добавления пользовательской строки вместо null?

Ответы [ 5 ]

38 голосов
/ 17 июня 2014

Приведенный выше ответ работает нормально для сериализации, но при десериализации, если есть поле с нулевым значением, Gson пропустит его и не введет метод десериализации адаптера типа, поэтому вам нужно зарегистрировать TypeAdapterFactory и вернутьвведите адаптер в нем.

Gson gson = GsonBuilder().registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory()).create();


public static class NullStringToEmptyAdapterFactory<T> implements TypeAdapterFactory {
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {

        Class<T> rawType = (Class<T>) type.getRawType();
        if (rawType != String.class) {
            return null;
        }
        return (TypeAdapter<T>) new StringAdapter();
    }
}

public static class StringAdapter extends TypeAdapter<String> {
    public String read(JsonReader reader) throws IOException {
        if (reader.peek() == JsonToken.NULL) {
            reader.nextNull();
            return "";
        }
        return reader.nextString();
    }
    public void write(JsonWriter writer, String value) throws IOException {
        if (value == null) {
            writer.nullValue();
            return;
        }
        writer.value(value);
    }
}
24 голосов
/ 22 ноября 2013

В текущей версии GSON вы можете сделать это:

    Object instance = c.getConstructor().newInstance();
    GsonBuilder gb = new GsonBuilder(); 
    gb.serializeNulls();
    Gson gson = gb.create(); 
    String stringJson = gson.toJson(instance);
7 голосов
/ 12 июня 2012

Ответ от Гугл групп

У меня была такая же ситуация.Этот образец помог мне.

import java.lang.reflect.Type;

public class StringConverter implements JsonSerializer<String>, 
    JsonDeserializer<String> { 
public JsonElement serialize(String src, Type typeOfSrc, 
    JsonSerializationContext context) { 
    if ( src == null ) { 
        return new JsonPrimitive(""); 
    } else { 
        return new JsonPrimitive(src.toString());
    }
} 
public String deserialize(JsonElement json, Type typeOfT, 
    JsonDeserializationContext context) 
        throws JsonParseException { 
    return json.getAsJsonPrimitive().getAsString(); 
} 
}

И использует:

GsonBuilder gb = new GsonBuilder(); 
gb.registerTypeAdapter(String.class, new StringConverter()); 
Gson gson = gb.create(); 
5 голосов
/ 29 февраля 2012

Если бы это был тип вашего приложения, вы могли бы зарегистрировать адаптер типа. Но Gson не позволяет вам изменять сериализованную форму строк или примитивных типов.

Лучше всего поменять объекты Java. Или ослабить ограничение вокруг нулей.

1 голос
/ 29 февраля 2012

Там нет решения. Я открыл вопрос на странице Гсона ; Надеюсь, что это будет исправлено в следующей версии.

...