Я вижу строку "urlToImage" в ответе json, но мой gsonfactory не анализирует ее!Зачем? - PullRequest
1 голос
/ 31 марта 2019

решено

Я выполняю асинхронный вызов с использованием модернизации, и когда я получаю ответ JSON, просматриваю сетевой журнал Я вижу , что он содержит "urlToImage" строку снекоторый URL, но когда мой gsonfactory анализирует его в json, модель "urlToImage" ВСЕГДА null .

I сгенерированный Объект POJO с ответом JSON, который я получаю, и использовал его как модель Json - не сработало.

Я попытался проанализировать другие строки из этого ответадля теста и каждая строка является гладкой, за исключением строк «ключ» и «urlToImage».Они всегда равны нулю.


В JSON ответ "urlToImage" не равен нулю:

answe


Моя модель JSON:

public class Article {

    private Source source;
    private String title;
    private String description;
    private String urlToImage;

----< constructor, getters and setters >----

  private class Source {

        private String name;

----< constructor, getters and setters >----
  }
}

Точка останова, где я вижу полный анализ JSON.Также я вижу, что urlToImage всегда имеет значение null:

null


Пример ответа JSON (опубликован на сайте, предоставляющем API):

example


Моя модель ответа:

public class JSONResponseArticles {
    private String status;
    private Article[] articles;

    public Article[] getArticles() {
        return articles;
    }
}

Мой GSON Factory (github) :

    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }

Обновление1

Как заметил @MC_Emperor, для моего gsonbuilder было установлено FieldNamingPolicy.Полный:

gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); Итак:

  • Я пытался переименовать urlToImage в url_to_image - без эффекта, все еще ноль;

  • Я попытался настроить FieldNamingPolicy.IDENITY документы: «использование этой политики именования с Gson гарантирует, что имя поля не изменится».- без эффекта, все еще ноль.

  • Я удалил FieldNamingPolicy - безрезультатно.

  • Я удалил GSON Builder, и теперь я просто передаю gsonfactory, как .addConverterFactory(GsonConverterFactory.create()) при создании модифицированного объекта - без эффекта, все еще ноль.


Также я нашел этот поток в проблемах Retrofit github, где разработчики называют это поведение "ошибкой" в Septerber 2015. Я не знаю, что это я, или что?


Обновление 2

в моих зависимостях у меня было только 'com.squareup.retrofit2:converter-gson:2.5.0', но когда я добавил 'com.google.code.gson:gson:2.8.5' urlToImage появился со значением, отличным от нуля!ВОТ ЭТО ДА.

1 Ответ

2 голосов
/ 01 апреля 2019

Это потому, что вы явно сказали Gson сделать это.

gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);

ожидает, что ваше поле urlToImage будет сопоставлено с ключом json url_to_image.

Вы видите, чтосвойства примера JSON уже записаны в camelCase.Они равны полям, которые вы определили в вашей модели.Если вы удалите политику именования полей, она будет работать.

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