JSON转换问题

时间:2017-09-11 20:36:40

标签: java json jackson

以下是我的示例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执行任何操作。有没有办法映射这个。有工作的方法吗?

3 个答案:

答案 0 :(得分:4)

  

是否必须对变量名称为thisAccount而不是this_account执行任何操作。

是的,确实如此。

  

有没有办法对此进行映射。

是的,寻找第3点

  

有办法上班吗?

是的,我现在能想到的其中3个

您的JSON包含一个名为this_account的字段,但您的类不包含thisAccount

有三种方法可以解决这个问题:

  1. 将变量名称更改为:this_account
  2. 将您的JSON字段更改为thisAccount
  3. (推荐)使用@JsonProperty上的thisAccount注释,如下所示:

    @JsonProperty("this_account")
    private ThisAccount thisAccount;
    

    这会将您的JSON属性this_account“链接”或“映射”到变量thisAccount

  4. 您需要对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);

映射器应该在那之后处理你的例子中的结构。