Java 使用Gson从JSON数组中排除空对象
我使用Gson解析对Java对象的restapi调用 我想过滤掉数组中的空对象,例如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
{
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 = 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;
}
}