簡體   English   中英

如何從對象中提取類型為List的屬性內的json數組

[英]How to extract array of json inside an attribute of type List from an object

我正在使用Flickr API來獲取圖像信息並返回以下JSON:

{“照片”:{“頁面”:1,“頁面”:60,“每頁”:100,“總計”:“ 5964”,“照片”:[{“ id”:“ 21577339501”,“所有者”: “ 85277110 @ N02”,“秘密”:“ 31e850dfeb”,“服務器”:“ 5785”,“農場”:6,“標題”:“ P1390956”,“ ispublic”:1,“ isfriend”:0,“ isfamily “:0},{” id“:” 21577287101“,”所有者“:” 85277110 @ N02“,”秘密“:” 412990658f“,”服務器“:” 611“,”農場“:1,”標題“: “ P1400012”,“ ispublic”:1,“ isfriend”:0,“ isfamily”:0}]

我在Spring控制器中使用以下代碼反序列化JSON:

Collection<Photos> readValues = objectMapper.readValue(new URL(url), new TypeReference<Collection<Photos>>() { });

並返回以下錯誤:

com.fasterxml.jackson.databind.JsonMappingException:無法從START_OBJECT令牌中反序列化java.util.ArrayList實例

我怎么解決這個問題? 我沒有找到解決方案。

照片類:

public class Photos {

    @JsonProperty("page")
    private Integer page;

    @JsonProperty("pages")
    private Integer pages;

    @JsonProperty("perpage")
    private Integer perpage;

    @JsonProperty("total")
    private Integer total;

    @JsonProperty("photo")
    @JsonDeserialize(contentAs = Photo.class, as = ArrayList.class)
    private List<Photo> photo;

    public Photos() {}

    public Photos(Integer page, Integer pages, Integer perpage, Integer total,
            List<Photo> photo) {
        super();
        this.page = page;
        this.pages = pages;
        this.perpage = perpage;
        this.total = total;
        this.photo = photo;
    }

    public Photos(List<Photo> photo) {
        super();
        this.photo = photo;
    }

    public Integer getPage() {
        return page;
    }
    public void setPage(Integer page) {
        this.page = page;
    }
    public Integer getPages() {
        return pages;
    }
    public void setPages(Integer pages) {
        this.pages = pages;
    }
    public Integer getPerpage() {
        return perpage;
    }
    public void setPerpage(Integer perpage) {
        this.perpage = perpage;
    }
    public Integer getTotal() {
        return total;
    }
    public void setTotal(Integer total) {
        this.total = total;
    }
    public List<Photo> getPhoto() {
        return photo;
    }

    public void setPhoto(List<Photo> photo) {
        this.photo = photo;
    }
}

照片類:

public class Photo {

    @JsonProperty("id")
    private Integer id;

    @JsonProperty("owner")
    private String owner;

    @JsonProperty("secret")
    private String secret;

    @JsonProperty("server")
    private Integer server;

    @JsonProperty("farm")
    private Integer farm;

    @JsonProperty("title")
    private String title;

    @JsonProperty("ispublic")
    private Boolean isPublic;

    @JsonProperty("isfriend")
    private Boolean isFriend;

    @JsonProperty("isfamily")
    private Boolean isFamily;

    public Photo() { }

    public Photo(Integer id, String owner, String secret, Integer server,
            Integer farm, String title, Boolean isPublic, Boolean isFriend,
            Boolean isFamily) {
        super();
        this.id = id;
        this.owner = owner;
        this.secret = secret;
        this.server = server;
        this.farm = farm;
        this.title = title;
        this.isPublic = isPublic;
        this.isFriend = isFriend;
        this.isFamily = isFamily;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }
    public String getSecret() {
        return secret;
    }
    public void setSecret(String secret) {
        this.secret = secret;
    }
    public Integer getServer() {
        return server;
    }
    public void setServer(Integer server) {
        this.server = server;
    }
    public Integer getFarm() {
        return farm;
    }
    public void setFarm(Integer farm) {
        this.farm = farm;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public Boolean getIsPublic() {
        return isPublic;
    }
    public void setIsPublic(Boolean isPublic) {
        this.isPublic = isPublic;
    }
    public Boolean getIsFriend() {
        return isFriend;
    }
    public void setIsFriend(Boolean isFriend) {
        this.isFriend = isFriend;
    }
    public Boolean getIsFamily() {
        return isFamily;
    }
    public void setIsFamily(Boolean isFamily) {
        this.isFamily = isFamily;
    }

}

基本問題是您的json 不是 Collection<Photos> ,而是Map<String, Photos> ,它只有一個條目"photos" -> Photos instance

通過進行以下更改,我使您的json成功反序列化了...

A)更改讀取的類型:

Map<String, Photos> readValues = objectMapper.readValue(json, new TypeReference<Map<String, Photos>>() { });

請注意,我直接從字符串(而不是URL)讀取。

B)將Photo.id的類型從Integer更改為Long ,因為您的json的ID值遠遠超過最大int大小。

C)我添加了示例json中缺少的兩個右括號,以使其有效。

僅供參考,反序列化的作品有或沒有@JsonDeserialize上標注List<Photo> photo的現場Photos


這是一些可以運行的代碼:

String json = "{\"photos\":{\"page\":1,\"pages\":60,\"perpage\":100,\"total\":\"5964\",\"photo\":[{\"id\":\"21577339501\",\"owner\":\"85277110@N02\",\"secret\":\"31e850dfeb\",\"server\":\"5785\",\"farm\":6,\"title\":\"P1390956\",\"ispublic\":1,\"isfriend\":0,\"isfamily\":0}, {\"id\":\"21577287101\",\"owner\":\"85277110@N02\",\"secret\":\"412990658f\",\"server\":\"611\",\"farm\":1,\"title\":\"P1400012\",\"ispublic\":1,\"isfriend\":0,\"isfamily\":0}]}}"; 
Map<String, Photos> readValues = new ObjectMapper().readValue(json, new TypeReference<Map<String, Photos>>() { });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM