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

Java 使用Gson从JSON数组中排除空对象,java,serialization,gson,Java,Serialization,Gson,我使用Gson解析对Java对象的restapi调用 我想过滤掉数组中的空对象,例如 { list: [ {"key":"value1"}, null, {"key":"value2"} ] } 应生成一个包含2项的列表 如何使用Gson实现这一点?回答:自定义序列化程序 您可以为List.class添加自定义序列化程序,如下所示: package com.dominikangerer.q27637811; import java.lang.reflect.T

我使用Gson解析对Java对象的restapi调用

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

{
  list: [
    {"key":"value1"},
    null,
    {"key":"value2"}
  ]
}
应生成一个包含2项的
列表

如何使用Gson实现这一点?

回答:自定义序列化程序 您可以为
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;
    }

}

可下载和可执行示例 您可以在my github stackoverflow answers repo中找到此答案和确切示例:


另请参见

要从列表中删除所有空值,而不管其结构如何,首先我们需要向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对象中的所有空元素来解决。因此,首先,我们为类型列表定义自定义JsonDeserializer

公共类RemoveNullListDeserializer实现JsonDeserializer{
@凌驾
公共列表反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
//待办事项
}
}
然后,删除JsonElement中的所有空元素。这里我们使用递归来处理这些潜在的空元素

private void removenullleinarray(JsonElement json){
if(json.isJsonArray()){
JsonArray JsonArray=json.getAsJsonArray();
for(int i=0;i
值得注意的是,仅删除top类中的null元素是不够的

下一步,在反序列化时传输此方法

公共类RemoveNullListDeserializer实现JsonDeserializer{
@凌驾
公共列表反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
RemovenulleInArray(json)
返回Gson().fromJson(json,typeOfT)
}
}
最后,注册用于创建Gson的适配器:

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

刚刚结束!

添加了一个可能满足您需要的答案:)如果您需要其他支持,请告诉我。@Quentin您得到这个问题的答案了吗?我也有同样的问题……这在其他方面也可能吗?反序列化?当然-您可以为此编写自己的反序列化程序<代码>@Override public List反序列化(最终JsonElement json,最终类型typeOfT,最终JsonDeserializationContext)抛出JsonParseException{…}
@DominikAngerer在反序列化过程中,如果json的结构不确定,您将如何从给定的json元素中删除所有空值?@striker好问题-我将考虑一个解决方案并返回到这个问题:)@DominikAngerer我找到了一个解决方案,诀窍是为类型列表注册一个derserializer,并使用一个反序列化程序删除所有JSON Null,我在answers部分发布了这一点,因此它也可以帮助其他人
/**
 * <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;
    }
}