web-dev-qa-db-ja.com

GSONにnullまたは空のオブジェクトと空の配列およびリストを省略するにはどうすればよいですか?

私はGsonを使用していますが、特定のJson文字列のサイズを縮小する必要がある状況にあります。 nullオブジェクトを配置せず、空の値のみを配置し、空のリストと配列をJson文字列に配置することでこれを実現したいと思います。

それを行う簡単な方法はありますか?

少し明確にしましょう。emptyProp:{}またはemptyArray:[]と書かれているものはすべてスキップしてください。空のプロパティのみを含むオブジェクトはスキップしたいのですが。

17
Joe

GsonBuilderにserializeNulls()を設定しない限り、null値はデフォルトで除外されます。

空のリストを作成する方法は、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;
  }
}

次に登録します

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

PomPom によると、HashMapは次の方法でシリアル化できます。

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