web-dev-qa-db-fra.com

Comment obtenez-vous que GSON omette les objets nuls ou vides et les tableaux et listes vides?

J'utilise Gson et je me trouve dans une situation dans laquelle je dois réduire la taille de certaines chaînes Json. Je voudrais le faire en faisant en sorte qu'il ne mette pas d'objets nuls, mais uniquement des valeurs vides, ainsi que des listes et des tableaux vides dans la chaîne Json.

Y a-t-il un moyen simple de le faire?

Laissez-moi clarifier un peu: je veux que tout ce qui dit: emptyProp: {} ou emptyArray: [] soit ignoré. Je souhaite que tout objet contenant uniquement des propriétés vides soit ignoré.

17
Joe

Les valeurs NULL sont exclues par défaut tant que vous ne définissez pas serializeNulls () sur votre GsonBuilder.

Un moyen de créer des listes vides consiste à créer un JsonSerializer

class CollectionAdapter implements JsonSerializer<List<?>> {
  @Override
  public JsonElement serialize(List<?> src, Type typeOfSrc, JsonSerializationContext context) {
    if (src == null || src.isEmpty()) // exclusion is made here
      return null;

    JsonArray array = new JsonArray();

    for (Object child : src) {
      JsonElement element = context.serialize(child);
      array.add(element);
    }

    return array;
  }
}

Puis enregistrez-le

Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(Collection.class, new CollectionAdapter()).create();
26
PomPom

Selon PomPom a HashMap peut être sérialisé via:

class MapAdapter implements JsonSerializer<Map<?, ?>> {
        @Override
        public JsonElement serialize(Map<?, ?> src, Type typeOfSrc,JsonSerializationContext context) {
            if (src == null || src.isEmpty())
                return null;
            JsonObject obj = new JsonObject();
            for (Map.Entry<?, ?> entry : src.entrySet()) {
                obj.add(entry.getKey().toString(), context.serialize(entry.getValue()));
            }
        return obj;
        }
    }
0
cbit