Gson Type Adapter с пользовательской логикой и логикой десериализации по умолчанию - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть класс модели gson, который содержит переменную с именем duration, которая является целым числом. Проблема в том, что когда эта переменная не имеет значения, сервер вместо того, чтобы возвращать мне null, возвращает "".

Это также относится и к спискам, когда я ожидаю List<String>? и в них нет значения, я получаю "" вместо null. К сожалению, сервер не может измениться.

Я исправил проблему с пользовательским десериализатором double, но мне нужно что-то более обобщенное c, потому что "" - это серверный подход по умолчанию. Вот мой прогресс, но в ветке else я не знаю, как заставить его продолжать работу с десериализатором по умолчанию.

internal class BadDeserializer : JsonDeserializer<Any> {

    @Throws(JsonParseException::class)
    override fun deserialize(
            json: JsonElement,
            type: Type,
            context: JsonDeserializationContext): Any? {
        return try {
            val json = json.asString
            if (json.isBlank()) {
                null
            } else {
               //Do nothing and call default behavior (?)
            }
        } catch (e: Exception) {
            throw JsonParseException(e)
        }
    }
}

1 Ответ

0 голосов
/ 16 апреля 2020

Это неудачный ответ, получающий пустую строку.

AFAIK Вы не можете зарегистрировать адаптер типа для примитивных типов с GSON, хотя, возможно, его можно зарегистрировать для их типов в штучной упаковке (не знаю, как это может работать с Kotlin).

Если вы можете использовать коробочные типы, то вы можете использовать что-то вроде следующего:

public class DoubleAdapter implements JsonDeserializer<Double> {

    @Override
    public Double deserialize(final JsonElement json,
                              final Type typeOfT,
                              final JsonDeserializationContext ctx) throws JsonParseException {
        if (!json.isJsonPrimitive()) {
            throw new JsonParseException("primitive expected");
        }
        final JsonPrimitive primitive = json.getAsJsonPrimitive();

        if (primitive.isString()) {
            final String value = primitive.getAsString();
            if ("".equals(value)) return null;
            throw new JsonParseException("double expected, not string");
        }

        if (!primitive.isNumber()) {
            throw new JsonParseException("double expected");
        }
        return primitive.getAsNumber().doubleValue();
    }

}

Хотя это может быть чище (и я обычно делаю для все) написать адаптер для любой структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...