web-dev-qa-db-fra.com

gson: traite null comme une chaîne vide

J'utilise google-gson pour sérialiser une carte Java dans une chaîne JSON. Il fournit un générateur gère les valeurs NULL :

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

Le problème est que le résultat est la chaîne null, comme dans:

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

Et le résultat requis est:

{"111111111":""}

Je peux faire un remplacement de chaîne pour null et "", mais c'est moche et sujet aux erreurs. Existe-t-il un support gson natif pour l’ajout d’une chaîne personnalisée au lieu de null

26
Adam Matan

S'il s'agissait de votre type d'application, vous pourriez enregistrer un adaptateur de type. Mais Gson ne vous permet pas de changer la forme sérialisée de chaînes ou de types primitifs.

Votre meilleur pari est de changer vos objets Java. Ou pour assouplir la restriction autour des valeurs nulles.

5
Jesse Wilson

La réponse ci-dessus fonctionne bien pour la sérialisation, mais lors de la désérialisation, s'il existe un champ avec une valeur nulle, Gson l'ignorera et n'entrera pas dans la méthode de désérialisation de l'adaptateur de type. Par conséquent, vous devez enregistrer un TypeAdapterFactory et le renvoyer. il.

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);
    }
}
38
oznus

Dans la version actuelle de gson, vous pouvez le faire:

    Object instance = c.getConstructor().newInstance();
    GsonBuilder gb = new GsonBuilder(); 
    gb.serializeNulls();
    Gson gson = gb.create(); 
    String stringJson = gson.toJson(instance);
24
Alessio

Réponse de Groupes Google

J'ai eu la même situation. Cet échantillon m'a aidé.

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(); 
} 
}

Et utilise:

GsonBuilder gb = new GsonBuilder(); 
gb.registerTypeAdapter(String.class, new StringConverter()); 
Gson gson = gb.create(); 
5
GeX

Il n'y a pas de solution. J'ai ouvert un numéro sur la page de Gson ; J'espère que cela sera corrigé sur la prochaine version.

1
Adam Matan