2013-08-09 3 views
0

у меня есть службы REST, который возвращает данные, выглядит следующим образом:Джексон и REST Android Аннотации: Deserialize JSON массив объектов

[ 
    { bookmark object json here }, 
    { bookmark object json here }, 
    { bookmark object json here }, 
    ... 
] 

Мой класс REST клиент выглядит следующим образом:

@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class}) 
public interface RestApiClient { 
    @Get("/bookmark/read?id={identifier}") 
    public BookmarkList getBookmarks(String identifier); 
} 

BookmarkList выглядит следующим образом:

public class BookmarkList { 
    List<Bookmark> bookmarks; 

    @JsonValue 
    public List<Bookmark> getBookmarks() { 
     return bookmarks; 
    } 

    @JsonCreator 
    public void BookmarkList(@NotNull List<Bookmark> bookmarks) { 
     this.bookmarks = bookmarks; 
    } 
} 

Однако, когда я использую эту настройку, я получаю следующее сообщение об ошибке:

Could not read JSON: Can not deserialize instance of com.whatever.entity.BookmarkList out of START_ARRAY token

То, что я хочу что-то вроде EventList например, в https://github.com/excilys/androidannotations/wiki/Rest-API#get, но это не похоже на работу для меня из коробки.

Есть ли способ заставить это работать?

ответ

2

Ho ... Мы должны обновить эту часть документации. Решение оболочки работает, но не соответствует API.

Если вы смотрите на сгенерированный код для @Get("url") MyReturnedType testService(), вы должны увидеть что-то вроде этого:

return restTemplate.exchange(rootUrl.concat("url"), // 
    HttpMethod.GET, // 
    null, // 
    MyReturnedType.class, // 
    urlVariables)// 
    .getBody(); 

Возвращаемый класс вводится в качестве параметра exchange вызова. В случае сбора дженериков (например, List<MyReturnedType>) мы не можем ввести List.class из-за проверки типа в обменном методе.

Однако, вы должны быть в состоянии использовать эту маленькую хитрость в вашем аннотированный метод @Rest:

public class BookmarkList extends List<Bookmark> { 
} 
+0

Мне нравится это лучше, чем мое оригинальное решение, поскольку это позволяет более эффективно использовать сгенерированный код. – mwu

+0

Я обновил [wiki] (https://github.com/excilys/androidannotations/wiki/Rest-API#parameterized-class), чтобы заменить упаковочное решение этим – DayS

0

Я думаю, что неправильно понял пример на https://github.com/excilys/androidannotations/wiki/Rest-API#get. Я думаю, что массив все еще должен быть обернут внутри объекта JSON в этом примере (было бы неплохо, если бы они включали примеры данных JSON).

Расширенные данные службы я подключая к не возвращает объект оберточной массив, как это, так, я изменил клиент REST, чтобы выглядеть следующим образом:

@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class}) 
public interface RestApiClient { 
    @Get("/bookmark/read?id={identifier}") 
    public ArrayNode getBookmarks(String identifier); 
} 

И я написал метод в другой класс итерировать ArrayNode и построить закладки:

public List<Bookmark> getBookmarks(Content content) { 
    ArrayList<Bookmark> bookmarks = new ArrayList<Bookmark>(); 
    ArrayNode bookmarksData = apiClient.getBookmarks(content.getAcid()); 

    for(JsonNode bookmarkData : bookmarksData) { 
     Bookmark bookmark = objectMapper.convertValue(bookmarkData, Bookmark.class); 
     bookmarks.add(bookmark); 
    } 
    return bookmarks; 
} 

так что это не так удобно (я должен был написать больше кода сам), но я получил это работает.

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