繁体   English   中英

使用 Gson 从 JSON 数组中排除空对象

[英]Exclude null objects from JSON array with Gson

我正在使用 Gson 来解析我对 Java 对象的 REST API 调用。

我想过滤掉数组中的空对象,例如

{
  list: [
    {"key":"value1"},
    null,
    {"key":"value2"}
  ]
}

应该导致List<SomeObject>有 2 个项目。

你怎么能用 Gson 做到这一点?

答案:自定义序列化程序

您可以为List.class添加自定义序列化List.class ,如下所示:

package com.dominikangerer.q27637811;

import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

public class RemoveNullListSerializer<T> implements JsonSerializer<List<T>> {

    @Override
    public JsonElement serialize(List<T> src, Type typeOfSrc,
            JsonSerializationContext context) {

        // remove all null values
        src.removeAll(Collections.singleton(null));

        // create json Result
        JsonArray result = new JsonArray();
        for(T item : src){
            result.add(context.serialize(item));
        }

        return result;
    }

}

这将使用Collections.singleton(null)removeAll()从列表中删除null值。

注册您的自定义序列化程序

现在您要做的就是将其注册到您的 Gson 实例,例如:

g = new GsonBuilder().registerTypeAdapter(List.class, new RemoveNullListSerializer()).create();

可下载和可执行示例

你可以在我的 github stackoverflow 答案仓库中找到这个答案和确切的例子:

Gson CustomSerializer 通过 DominikAngerer 从列表中删除 Null


也可以看看

要从列表中删除所有空值而不管它们的结构如何,首先我们需要像这样使用 gson 注册一个反序列化器

 Gson gson = new GsonBuilder().registerTypeAdapter(List.class, new RemoveNullListDeserializer()).create();

然后自定义反序列化器会像这样删除空值

/**
 * <p>
 * Deserializer that helps remove all <code>null</code> values form the <code>JsonArray</code> .
 */
public class RemoveNullListDeserializer<T> implements JsonDeserializer<List<T>>
{
    /**
     * {@inheritDoc}
     */
    @Override
    public List<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
    {
        JsonArray jsonArray = new JsonArray();
        for(final JsonElement jsonElement : json.getAsJsonArray())
        {
            if(jsonElement.isJsonNull())
            {
                continue;
            }
            jsonArray.add(jsonElement);
        }

        Gson gson = new GsonBuilder().create();
        List<?> list = gson.fromJson(jsonArray, typeOfT);
        return (List<T>) list;
    }
}

希望这可以帮助其他想要从 json 数组中删除空值的人,无论传入的 json 结构如何

我的回答可能晚了,但我希望它能奏效。 这个问题可以通过在反序列化json字符串时去掉Java对象中所有的空元素来解决。 所以首先,我们为List类型定义自定义的JsonDeserializer

public class RemoveNullListDeserializer<T> implements JsonDeserializer<List<T>> {
    @Override
    public List<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        //TODO
    }
}

然后,删除 JsonElement 中的所有空元素。 这里我们使用递归来处理这些潜在的空元素。

    private void removeNullEleInArray(JsonElement json) {
        if (json.isJsonArray()) {
            JsonArray jsonArray = json.getAsJsonArray();
            for (int i = 0; i < jsonArray.size(); i++) {
                JsonElement ele = jsonArray.get(i);
                if (ele.isJsonNull()) {
                    jsonArray.remove(i);
                    i--;
                    continue;
                }
                removeNullEleInArray(ele);
            }
        } else if (json.isJsonObject()) {
            JsonObject jsonObject = json.getAsJsonObject();
            for (String key : jsonObject.keySet()) {
                JsonElement jsonElement = jsonObject.get(key);
                if (jsonElement.isJsonArray() || jsonElement.isJsonObject()) {
                    removeNullEleInArray(jsonElement);
                }
            }

        }
    }

值得注意的是,仅删除顶级类中的空元素是不够的。

下一步,在反序列化时调用此方法。

public class RemoveNullListDeserializer<T> implements JsonDeserializer<List<T>> {
    @Override
    public List<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        removeNullEleInArray(json)
        return Gson().fromJson(json, typeOfT)
    }
}

最后,注册用于创建 Gson 的适配器:

    Gson gson = new GsonBuilder()
                .registerTypeAdapter(List.class, new RemoveNullListDeserializer())
                .create();

完了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM