Я использую Gson для анализа моих вызовов REST API на объекты Java.
Я хочу отфильтровать нулевые объекты в массиве, например
{
list: [
{"key":"value1"},
null,
{"key":"value2"}
]
}
должен привести к List<SomeObject>
с двумя элементами.
Как вы можете это сделать с Гсеном?
Вы можете добавить пользовательский сериализатор для 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;
}
}
Это приведет к удалению null
значений из списка с помощью Collections.singleton(null)
и removeAll()
.
Зарегистрируйте свой пользовательский сериализатор
Теперь все, что вам нужно сделать, это зарегистрировать его в своем экземпляре Gson, например:
g = new GsonBuilder().registerTypeAdapter(List.class, new RemoveNullListSerializer()).create();
Вы можете найти этот ответ, и конкретный пример в моем github stackoverflow отвечает на репо:
Gson CustomSerializer для удаления Null из списка по DominikAngerer
@Override public List<T> deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { ... }
Чтобы удалить все нулевые значения из списка независимо от их структуры, сначала нам нужно зарегистрировать де-сериализатор с 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-структуры