Исключить нулевые объекты из массива JSON с помощью Gson

1

Я использую Gson для анализа моих вызовов REST API на объекты Java.

Я хочу отфильтровать нулевые объекты в массиве, например

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

должен привести к List<SomeObject> с двумя элементами.

Как вы можете это сделать с Гсеном?

  • 0
    Добавил ответ, который может удовлетворить ваши потребности :), дайте мне знать, если вам нужна дополнительная поддержка.
  • 0
    @Quentin Квентин, ты получил ответ на этот вопрос, у меня тоже такая же проблема ...
Теги:
serialization
gson

2 ответа

0
Лучший ответ

Ответ: Пользовательский сериализатор

Вы можете добавить пользовательский сериализатор для 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


Смотрите также

  • 0
    возможно ли это и в другом направлении? десериализации?
  • 0
    Конечно, вы можете написать свой собственный десериализатор для этого. @Override public List<T> deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) throws JsonParseException { ... }
Показать ещё 6 комментариев
0

Чтобы удалить все нулевые значения из списка независимо от их структуры, сначала нам нужно зарегистрировать де-сериализатор с 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-структуры

Ещё вопросы

Сообщество Overcoder
Наверх
Меню