Разбор Json с использованием Gson и Retrofit (Custom Deserializer) - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно создать список мест (из массива response создать экземпляр place и, наконец, получить список мест (place в json))?

Как разобрать его с помощью Gson иДооснащение нестандартным десериализатором?

У меня есть следующая структура:

{
"success": true,
"error": null,
"response": [
   {
      "loc": {
          "lat": 51.50853,
          "long": -0.12574
      },
      "place": {
           "name": "London",
           "state": "",
           "stateFull": "",
           "country": "GB",
           "countryFull": "United Kingdom",
           "region": "",
           "regionFull": "",
           "continent": "eu",
           "continentFull": "Europe"
       },
       "profile": {
           "elevM": 21,
           "elevFT": 69,
           "pop": 7556900,
           "tz": "Europe/London",
           "tzname": "BST",
           "tzoffset": 3600,
           "isDST": true,
           "wxzone": null,
           "firezone": null,
           "fips": null,
           "countyid": null
        }
      },
       .............
       .............
    ]
}

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать плагин для Android Studio RoboPOJOGenerator .Создавать классы моделей из данных очень просто.

В этом ответе рассказывается, как обрабатывать ответ List при модернизации.

img

Обновление

Я не думаю, что будет хорошей идеей сделать пользовательский десериализатор просто для анализа списка.Когда вы можете фильтровать или отображать список после получения ответа.Это займет до 3-4 строк кода.

Если вы не хотите много классов.тогда вы можете безопасно удалить Profile.java и Loc.java, в вашем случае Gson будет анализировать только те данные, которые вы объявили в вашем pojo.

Создать общий класс ответа

Вы можете создать отдельный класс для обработки всех ответов, используя Generics Java .См. Пример.

public class ApiResponse<T> {
    @SerializedName("error")
    @Expose
    private String error;
    @SerializedName("success")
    @Expose
    private boolean success;
    @SerializedName("response")
    @Expose
    private T response;

    // make getter setters
}

Теперь в ApiService вы можете определить тип response.Вот так

@GET("api/users/login")
Call<ApiResponse<ModelUser>> getUser();

@GET("api/users/login")
Call<ApiResponse<ModelCity>> getCity();

Таким образом, вам не нужно каждый раз создавать 3 класса.Этот общий класс будет работать для всех ответов.

...