[英]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.