Как обработать пустую строку как нулевую, используя retrofit2 с Gson - PullRequest
1 голос
/ 17 апреля 2019

Я использую Retrofit2 с Gson, чтобы получить ответ от общественности API.

Ответ выглядит примерно так:

{"replies":[{"data":"value1"},{"data":"value2"}]}

но когда поле ответов пусто, данные выглядят так:

{"replies": ""}

Итак, если я рассматриваю ответы как строку, я получаю исключение, когда получаю массив. И когда я воспринимаю это как массив, я получаю исключение, когда получаю пустую строку.

Есть ли способ разрешить его так, чтобы я мог игнорировать значение, как если бы оно было null, когда это пустая строка?

Я бы проанализировал его вручную, но фактический ответ огромен, и я бы предпочел просто использовать Gson, чем написать собственный анализ для ответа.

1 Ответ

3 голосов
/ 17 апреля 2019

Вы можете написать собственный десериализатор, который в случае JSON Array десериализует его, используя Gson базовый десериализатор, а во всех других случаях вы можете вернуть null или пустой список.Посмотрите на приведенный ниже пример:

class RepliesJsonDeserializer implements JsonDeserializer<List<Reply>> {

    @Override
    public List<Reply> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonArray()) {
            JsonArray array = json.getAsJsonArray();
            List<Reply> replies = new ArrayList<>(array.size());
            array.forEach(item -> replies.add(context.deserialize(item, Reply.class)));

            return replies;
        }

        // in all other case empty list or null
        return Collections.emptyList();
    }
}

Я предполагаю, что ваш Pojo выглядит следующим образом (Reply - это имя класса элемента в списке):

class Replies {

    @JsonAdapter(RepliesJsonDeserializer.class)
    private List<Reply> replies;

    // getters, setters, toString
}

Как вы можете заметить, мы используем аннотацию @JsonAdapter для регистрации нашей RepliesJsonDeserializer пользовательской реализации.Я предлагаю возвращать Collections.emptyList() всегда только для того, чтобы иметь четкий код и избегать проверки null.

...