Jackson和REST Android注释:反序列化对象的JSON数组

Jackson和REST Android注释:反序列化对象的JSON数组,rest,jackson,android-annotations,Rest,Jackson,Android Annotations,我有一个REST服务,它返回的数据如下所示: [ { bookmark object json here }, { bookmark object json here }, { bookmark object json here }, ... ] @Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class}) publi

我有一个REST服务,它返回的数据如下所示:

[
    { bookmark object json here },
    { bookmark object json here },
    { bookmark object json here },
    ...
]
@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public BookmarkList getBookmarks(String identifier);
}
public class BookmarkList {
    List<Bookmark> bookmarks;

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

    @JsonCreator
    public void BookmarkList(@NotNull List<Bookmark> bookmarks) {
        this.bookmarks = bookmarks;
    }
}
@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public ArrayNode getBookmarks(String identifier);
}
我的REST客户端类如下所示:

[
    { bookmark object json here },
    { bookmark object json here },
    { bookmark object json here },
    ...
]
@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public BookmarkList getBookmarks(String identifier);
}
public class BookmarkList {
    List<Bookmark> bookmarks;

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

    @JsonCreator
    public void BookmarkList(@NotNull List<Bookmark> bookmarks) {
        this.bookmarks = bookmarks;
    }
}
@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public ArrayNode getBookmarks(String identifier);
}
书签列表如下所示:

[
    { bookmark object json here },
    { bookmark object json here },
    { bookmark object json here },
    ...
]
@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public BookmarkList getBookmarks(String identifier);
}
public class BookmarkList {
    List<Bookmark> bookmarks;

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

    @JsonCreator
    public void BookmarkList(@NotNull List<Bookmark> bookmarks) {
        this.bookmarks = bookmarks;
    }
}
@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public ArrayNode getBookmarks(String identifier);
}
公共类书签列表{
列出书签;
@JsonValue
公共列表getBookmarks(){
返回书签;
}
@JsonCreator
公共无效书签列表(@NotNull List bookmarks){
this.bookmarks=书签;
}
}
但是,当我使用此设置时,会出现以下错误:

无法读取JSON:无法反序列化启动\u数组标记之外的com.whatever.entity.BookmarkList实例

我想要的是类似于的事件列表示例,但这似乎不适合我


有什么办法可以让它工作吗?

我想我当时误解了这个例子。我认为在该示例中,数组仍然必须包装在JSON对象中(如果它们包含示例JSON数据就更好了)

我连接到的服务的数据不会返回这样包装数组的对象,因此,我将REST客户端更改为如下所示:

[
    { bookmark object json here },
    { bookmark object json here },
    { bookmark object json here },
    ...
]
@Rest(rootUrl = Constants.ApiConfig.API_ROOT, converters = {MappingJackson2HttpMessageConverter.class})
public interface RestApiClient {
    @Get("/bookmark/read?id={identifier}")
    public BookmarkList getBookmarks(String identifier);
}
public class BookmarkList {
    List<Bookmark> bookmarks;

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

    @JsonCreator
    public void BookmarkList(@NotNull List<Bookmark> bookmarks) {
        this.bookmarks = bookmarks;
    }
}
@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;
}
public List getBookmarks(内容){
ArrayList bookmarks=新建ArrayList();
arraynodebookmarksdata=apiClient.getBookmarks(content.getAcid());
for(JsonNode bookmarkData:bookmarksData){
Bookmark Bookmark=objectMapper.convertValue(bookmarkData,Bookmark.class);
书签。添加(书签);
}
返回书签;
}

所以它不是那么方便(我不得不自己写更多的代码),但我让它工作起来了。

。。。我们必须更新这部分文档。包装器解决方案可以工作,但不适合API

如果您正在查看为
@Get(“url”)MyReturnedType testService()生成的代码,您应该会看到如下内容:

return restTemplate.exchange(rootUrl.concat("url"), //
    HttpMethod.GET, //
    null, //
    MyReturnedType.class, //
    urlVariables)//
  .getBody();
返回的类作为
exchange
call的参数被注入。对于泛型集合(如
List
),我们不能注入
List.class
,因为在exchange方法的返回中进行了类型检查

但是,您应该能够在
@Rest
注释方法中使用此小技巧:

public class BookmarkList extends List<Bookmark> {
}
public类BookmarkList扩展列表{
}

与我的原始解决方案相比,我更喜欢此解决方案,因为它更好地利用了生成的代码。我更新了此解决方案以替换包装解决方案