2015-07-11 136 views
0

我无法获取发送给pojo的json字符串。将jsonnode转换为pojo

com.fasterxml.jackson.databind.JsonMappingException:无法反序列化com.sg.info.Account的情况下进行的[来源START_ARRAY令牌 的:[email protected];行:1,柱:1]

这是JSON

[{"accno":9210255,"type":"Stock- and mutual funds account","default":true,"alias":"Karlsson Joachim"}] 

解析

public void getAccounts() 
    { 
     ObjectMapper mapper = new ObjectMapper(); 
     String resp = Login.getBaseResource().path("accounts").request(Login.getResponsetype()).get(String.class); 

     try { 

      account = mapper.readValue(resp, Account.class); 

POJO

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonIgnoreProperties(ignoreUnknown=true) 
public class Account { 

    public Account() { 

    } 
    private long accno; 
    private String type; 
    @JsonProperty("default") 
    private String isDefault; 
    private String alias; 


    public long getAccno() { 
     return accno; 
    } 
    public void setAccno(long accno) { 
     this.accno = accno; 
    } 
    public String getType() { 
     return type; 
    } 
    public void setType(String type) { 
     this.type = type; 
    } 
    public String getAlias() { 
     return alias; 
    } 
    public void setAlias(String alias) { 
     this.alias = alias; 
    } 
    @Override 
    public String toString() { 
     return "Account [accno=" + accno + ", type=" + type + ", alias=" 
       + alias + "]"; 
    } 
    public String isDefault() { 
     return isDefault; 
    } 
    @JsonProperty("default") 
    public void setDefault(String isDefault) { 
     this.isDefault = isDefault; 
    } 




} 

回答

1

你的问题是你有JSON是一个数组,并可以有多个帐户。如果您解析代码更改为这样的事情,它会工作:

ObjectMapper mapper = new ObjectMapper(); 
    String str = "[{\"accno\":9210255,\"type\":\"Stock- and mutual funds account\",\"default\":true,\"alias\":\"Karlsson Joachim\"}]"; 

    JavaType accountListType = mapper.getTypeFactory().constructArrayType(Account.class); 

    Account[] accounts = SharedJsonSerializer.objectMapper().readValue(str, accountListType); 

当然最好是使用集合类型,你可以建立基于mapper.getTypeFactory()你想要的任何类型的

+0

这是有效的,但是对于数组类型,也有一个不太出名的漂亮短小猫:只需将'Account [] .class'作为类型即可! – StaxMan

+0

这确实有用。但我希望他会用这种方法来创建集合,而不是...恕我直言,总是更好地使用数组集合 –

+0

数组和集合有它们自己的好处,我没有看到集合本质上更好,尤其是对于简单数据访问对象。 – StaxMan