【问题标题】:How do you get GSON to omit null or empty objects and empty arrays and lists?你如何让 GSON 省略 null 或空对象以及空数组和列表?
【发布时间】:2012-08-13 20:51:41
【问题描述】:

我正在使用 Gson,并且我必须缩小某些 Json 字符串的大小。我想让它不将空对象、空值以及空列表和数组放入 Json 字符串中。

有没有直接的方法可以做到这一点?

让我澄清一下:我希望跳过以下所有内容:emptyProp:{} 或 emptyArray:[]。我希望跳过任何只包含空属性的对象。

【问题讨论】:

  • 这不是默认行为吗?
  • 不,它会放入空数组等
  • "它放入空数组等" ——???我建议发布一个完整的最小示例来说明您正在谈论的内容。文档说,“在序列化时,会从输出中跳过一个空字段”(但如果这不正确,我不会感到惊讶)。
  • 那我有点迷惑:“不放空对象,only空值……”这里的“only”是什么意思?您想要包含空值等还是不想包含它们?
  • 我想要空值,例如排除空字符串。

标签: java json gson


【解决方案1】:

只要您不将 serializeNulls() 设置为 GsonBuilder,默认情况下会排除 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();

【讨论】:

  • 你确定上面的代码是正确的吗?我尝试时似乎没有任何影响?
  • 是的,这对我也不起作用,直到我将 Collection&lt;?&gt; 更改为 List&lt;?&gt; 然后它按原样工作
  • 我还添加了另一个实现 JsonSerializer 的类。这会处理 JSON 中的空对象 {}
  • @mdev 我们如何扩展它以忽略空字符串和空列表?
【解决方案2】:

根据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;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2013-07-22
    • 1970-01-01
    • 2015-02-06
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多