我正在尝试将以下JSON转换为java对象。
{
"Data":[
{
"AccountId":"2009852923",
"Currency":"EUR",
"Nickname":"SA 01",
"Account":{
"SchemeName":"BBAN",
"Name":"SA 01",
"Identification":"2009852923"
},
"Servicer":{
"SchemeName":"BICFI",
"Identification":"FNBSZAJJ"
}
},
{
"AccountId":"1028232942",
"Currency":"EUR",
"Nickname":"FNBCREDIT",
"Account":{
"SchemeName":"BBAN",
"Name":"FNBCREDIT",
"Identification":"1028232942"
},
"Servicer":{
"SchemeName":"BICFI",
"Identification":"FNBSZAJJ"
}
}
],
"Links":{
"self":"http://localhost:3000/api/open-banking/accounts/1009427721/transactions"
},
"Meta":{
"total-pages":1
}
}
使用以下DTO(为简便起见,未发布所引用的类)。
public class TransactionDTO {
private Data[] data;
private Links links;
private Meta meta;
public Data[] getData () { return data; }
public void setData (Data[] data) { this.data = data; }
public Links getLinks () { return links; }
public void setLinks (Links links) { this.links = links; }
public Meta getMeta () { return meta; }
public void setMeta (Meta meta) { this.meta = meta; }
}
将DTO转换为Java对象的代码为:
private TransactionDTO marshall(String accountTransactionsJSON) {
ObjectMapper objectMapper = new ObjectMapper();
TransactionDTO transactionDTO = null;
try {
transactionDTO = objectMapper.readValue(accountTransactionsJSON, TransactionDTO.class);
} catch (IOException e) {
e.printStackTrace();
}
return transactionDTO;
}
我收到此错误:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Data" (class xxx.dto.TransactionDTO), not marked as ignorable (3 known properties: "links", "data", "meta"])
at [Source: java.io.StringReader@48f43b70; line: 2, column: 11] (through reference chain: xxx.dto.TransactionDTO["Data"])
我尝试了其他方法来解决此问题,例如:
objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
以及:
@JsonRootName(value = "data")
但是我遇到了同样的问题,或者没有问题,但是TransactionDTO
仅包含null
值。
我想问题是Data
字段,但是我不知道如何解决此问题(解决方案here也不适合我)。
问题
答案 0 :(得分:2)
Jackson默认情况下区分大小写。试试这个:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
答案 1 :(得分:2)
问题是您的JSON属性名称(例如"Data"
)
与您的Java属性名称不匹配(例如data
)。
除了@psmagin的答案以外,还有两种其他方法可以解决此问题:
保持Java代码不变。
并在JSON内容中更改所有键(:
剩余的字符串)
从大写到小写:
{
"data":[
{
"accountId":"2009852923",
"currency":"EUR",
"nickname":"SA 01",
"account":{
"schemeName":"BBAN",
"name":"SA 01",
"identification":"2009852923"
},
....
}
保持JSON内容不变。
在您的Java代码中使用@JsonProperty
批注
告诉杰克逊您Java属性的相应JSON属性名称:
public class TransactionDTO {
private @JsonProperty("Data") Data[] data;
private @JsonProperty("Links") Links links;
private @JsonProperty("Meta") Meta meta;
public Data[] getData () { return data; }
public void setData (Data[] data) { this.data = data; }
public Links getLinks () { return links; }
public void setLinks (Links links) { this.links = links; }
public Meta getMeta () { return meta; }
public void setMeta (Meta meta) { this.meta = meta; }
}
并以相同的方式在其他Java类中
(Links
,Meta
,Data
,...)
我宁愿选择第一个选项,因为属性名称的首字母为小写 是JSON和Java中公认的最佳实践。
答案 2 :(得分:1)
我通过这种方法解决了类似的问题
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
答案 3 :(得分:0)
我收到此错误,因为我不打算将所有JSON字段映射到我的POJO,而仅将其中的几个映射到我的POJO。因此,它要我标记他们为无视。以下示例提出了这个想法:
@JsonIgnoreProperties(ignoreUnknown = true)
public class Book {
@JsonProperty("kind")
private String kind;
@JsonProperty("id")
private String id;
@JsonProperty("volumeInfo")
private BookInfo bookInfo;
@Override
public String toString() {
return "ClassPojo [kind = " + kind + ", id = " + id + ", bookInfo = " + bookInfo +"]";
}
另一方面,我的Json响应执行了10多个字段。