以下是我的示例JSON数据。它在转换期间给出了以下异常。还有另一个类具有事务列表。
交易
public class Transactions{
private String id;
private ThisAccount thisAccount;
private OtherAccount otherAccount;
private Details details;
private Metadata metadata;
public String getId(){
return id;
}
public void setId(String input){
this.id = input;
}
public ThisAccount getThisAccount(){
return thisAccount;
}
public void setThisAccount(ThisAccount input){
this.thisAccount = input;
}
public OtherAccount getOtherAccount(){
return otherAccount;
}
public void setOtherAccount(OtherAccount input){
this.otherAccount = input;
}
public Details getDetails(){
return details;
}
public void setDetails(Details input){
this.details = input;
}
public Metadata getMetadata(){
return metadata;
}
public void setMetadata(Metadata input){
this.metadata = input;
}
public String toString() {
return this.getId();
}
}
JSON
{
"transactions":[
{
"id":"dcb8138c-eb88-404a-981d-d4edff1086a6",
"this_account":{
"id":"savings-kids-john",
"holders":[
{
"name":"Savings - Kids John",
"is_alias":false
}
],
"number":"832425-00304050",
"kind":"savings",
"IBAN":null,
"swift_bic":null,
"bank":{
"national_identifier":"rbs",
"name":"The Royal Bank of Scotland"
}
},
"other_account":{
"id":"c83f9a12-171e-4602-9a92-ae895c41b16b",
"holder":{
"name":"ALIAS_CBCDE5",
"is_alias":true
},
"number":"13677980653",
"kind":"CURRENT PLUS",
"IBAN":"BA12 1234 5123 4513 6779 8065 377",
"swift_bic":null,
"bank":{
"national_identifier":null,
"name":"The Bank of X"
},
"metadata":{
"public_alias":null,
"private_alias":null,
"more_info":null,
"URL":null,
"image_URL":null,
"open_corporates_URL":null,
"corporate_location":null,
"physical_location":null
}
},
"details":{
"type":"sandbox-payment",
"description":"Description abc",
"posted":"2016-10-09T20:01:53Z",
"completed":"2016-10-09T20:01:53Z",
"new_balance":{
"currency":"GBP",
"amount":null
},
"value":{
"currency":"GBP",
"amount":"10.00"
}
},
"metadata":{ }
},
{
"id":"06ffa118-7892-45c7-8904-f938766680dd",
"this_account":{ },
"other_account":{ },
"details":{ },
"metadata":{ }
},
{
"id":"2d633a56-cd59-4ee5-8dae-142750a1a1b4",
"this_account":{ },
"other_account":{ },
"details":{ },
"metadata":{ }
},
]
}
异常
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "this_account" (class com.transactionRetrieval.controller.Transactions), not marked as ignorable (5 known properties: "details", "id", "otherAccount", "thisAccount", "metadata"])
at [Source: java.io.StringReader@7d8ea76c; line: 1, column: 79] (through reference chain: com.transactionRetrieval.controller.TransactionsList["transactions"]->java.util.ArrayList[0]->com.transactionRetrieval.controller.Transactions["this_account"])
是否必须对变量名称为thisAccount而不是this_account执行任何操作。有没有办法映射这个。有工作的方法吗?
答案 0 :(得分:4)
是否必须对变量名称为thisAccount而不是this_account执行任何操作。
是的,确实如此。
有没有办法对此进行映射。
是的,寻找第3点
有办法上班吗?
是的,我现在能想到的其中3个
您的JSON包含一个名为this_account
的字段,但您的类不包含thisAccount
。
有三种方法可以解决这个问题:
this_account
thisAccount
(推荐)使用@JsonProperty
上的thisAccount
注释,如下所示:
@JsonProperty("this_account")
private ThisAccount thisAccount;
这会将您的JSON属性this_account
“链接”或“映射”到变量thisAccount
。
您需要对JSON和类中具有不同名称的所有其他变量/字段执行相同的操作。
参考:https://github.com/FasterXML/jackson-annotations#annotations-for-renaming-properties
答案 1 :(得分:1)
即使您的问题的其他答案有效,我也不认为对每个属性进行注释将是推荐的方法。相反,使用命名策略:
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
答案 2 :(得分:1)
Frakcool的建议允许您在将JSON属性名称链接到Java属性名称时明确,这通常是最安全的方式。
但是对于您的示例可能有一些更简单的事情:看起来命名遵循一种模式,其中JSON中的multi_word_property
在Java中变为multiWordProperty
。
这是一种普遍的风格,杰克逊实际上已经内置了对它的支持。在创建ObjectMapper
时,您可以这样配置:
ObjectMapper mapper = ...;
// jackson-databind versions ≥ 2.7
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
// jackson-databind versions < 2.7
mapper.setPropertyNamingStrategy(
PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
映射器应该在那之后处理你的例子中的结构。