2016-01-27 2 views
1

К примеру у меня есть JSON выглядит следующим образом:Является ли retrofit поддержкой keypath в разборе json или как к этому?

{ 
    "data": [ 
     { 
      "name": "one" 
     }, 
     { 
      "name": "two" 
     } 
    ] 
} 

Например у меня есть объект пользователя с именем поля.

Возможно ли метод записи, который будет анализировать массив данных для объектов User?

что-то вроде

Call<List<User>> getUsers(@KeyPath("data")) 

Теперь, чтобы сделать это, мне нужно создать класс обертку что-то вроде

общественного класса UsersWrapper { @SerializeName ("данные") пользователей общественных ArrayList; }

и в обслуживании я сделать следующие

public interface Service { 
@GET("users") 
    Call<UsersWrapper> getUsers() 
} 

Но мои все запросы только ответ с данными, но переменных объектов в массиве.

В этом случае мне нужно создать обертку для любых запросов данных. Боль :(

+1

Непонятный вопрос. Ваш объект ответа должен быть массивом 'User' – gilgil28

+0

Список данные; –

+0

Я, как правило, решаю это, обращаясь к вызову 'JsonObject', затем подключаю вызов в трансформаторе, который использует экземпляр gson для получения списка из' JsonObject'. И затем я иду за писателем API, пока они не изменят его. – njzk2

ответ

2

Я хотел бы сделать это следующим образом:

Глобальный класс Wrapper<T> для разбора в целом JSON

public class Wrapper<T> { 
    public List<T> data; 
} 

И User для анализа фактического массива;

public class User { 
    public String name; 
} 
?

Затем интерфейс API:

@GET("/people") 
Wrapper<User> getUsers(); 

И в DataSource классе просто сделать что-то вроде этого:

@Override 
public List<User> getUsers() { 
    Wrapper<User> usersWrapper = myApiInterface.getUsers(); 
    return usersWrapper.data; 
} 

Upd1:
Другим решением является создание пользовательских JsonDeserializer (например, описанного here) для List<User> типа, зарегистрируйтесь на registerTypeAdapter это с вашим обычным Gson объектом, а затем вы можете десериализировать свой Json прямо в List<User>. Хотя это решение приносит гораздо больше дополнительного кода, и потенциальная польза для меня неясна.

+1

Это работает. Вы также можете обобщить это для нескольких вызовов API для 'class Wrapper {public List данных; } ', если ваши ответы все используют один и тот же ключ' data'. – njzk2

+0

@ njzk2 хороший пункт! обновил мой ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^