Как обработать ответ JSON для списка объектов или отдельного объекта с помощью модернизации? - PullRequest
0 голосов
/ 08 января 2019

Я звоню в службу REST (не мою), используя модификацию, которая либо возвращает список объектов (если их несколько), либо один объект (если он есть). Мне удалось найти аналогичную проблему здесь , однако предлагается изменить API, который я не могу контролировать. Я также прочитал эту ветку , которая кажется хорошим подходом, но есть ли способ справиться с этим с помощью Retrofit?

Ответы [ 3 ]

0 голосов
/ 08 января 2019

Как автор 2-го поста, на который вы ссылались, я также ссылаюсь на реализацию PostArrayOrSingleDeserializer, описанную в этом моем ответе .

При использовании Gson с Retrofit (преобразователь-преобразователь Retrofit-gson) вам просто нужно зарегистрировать адаптер с пользовательским экземпляром Gson и создать экземпляр Retrofit с этим экземпляром Gson, см. Ниже пример вспомогательного класса:

public class MyRetrofit {
    public static MyAPI getMyApi() {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Object.class,
                        new ObjectArrayOrSingleDeserializer())
                .create();
        Retrofit retrofit = new Retrofit.Builder()  
                .baseUrl("https://example.org")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        return retrofit.create(MyAPI.class);
    }
}

Таким образом, Object в JsonDeserializer с именем ObjectArrayOrSingleDeserializer - это DTO, который вы должны проверить для отдельного экземпляра или массива. Замените Object соответствующим DTO и измените десериализатор соответственно.

0 голосов
/ 10 января 2019

Хотя ответ от @pirho, кажется, применим, я нашел другое и простое решение, которое сработало для меня. Надеюсь, это может помочь и другим.

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(JacksonConverterFactory.create(mapper))
            .client(okHttpClient)
            .build();
0 голосов
/ 08 января 2019

В ответ вы можете получить данные ответа API как Map<String, JsonElement>, а затем проанализировать их в соответствии с вашими требованиями. Как вы можете проверить здесь, является ли JsonElement JsonArray

Например:

public fun parseData(val jsonElement:JsonElement){

  val gson = Gson()

  if(jsonElementFromServer.isJsonArray()){
    //here you can just parse it into some list of array

  }else{
    //here you can parse using gson to single item element or model 

  }

}

JsonElement ref

Использование Gson для получения списка элементов или одного модели

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