2013-10-24 71 views
6

REST服務與傑克遜JSON解析與unwraping根,但沒有設置@JsonRootName

<transaction><trxNumber>1243654</trxNumber><type>INVOICE</type></transaction> 

或JSON響應能力:

{"transaction":{"trxNumber":1243654,"type":"INVOICE"}} 

有沒有問題,當我使用:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) 

而作爲結果類

@JsonRootName("transaction") 
public class Transaction { 
private String trxNumber; 
private String type; 
//getters and setters 
} 

但實際上我應該使用來自第三方jar的Transaction類,它與上面的完全一樣,但沒有@JsonRootName(「transaction」)註釋。

所以我最終

Could not read JSON: Root name 'transaction' does not match expected ('Transaction') for type... 

有沒有辦法迫使傑克遜解析到交易類不添加任何東西到交易類本身(因爲我得到這個文件作爲二進制罐子的一部分) ?

我試過自定義PropertyNamingStrategy,但它似乎必須做與字段和getter/setter名稱,但不是類名稱。

Java7,Jackson 2.0.5。

有什麼建議嗎?謝謝。

回答

5

您可以使用mixin功能。您可以創建簡單的接口/抽象類是這樣的:

@JsonRootName("transaction") 
interface TransactionMixIn { 

} 

現在,您必須配置ObjectMapper對象:

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
mapper.addMixInAnnotations(Transaction.class, TransactionMixIn.class); 

最後,你可以用它來反序列化JSON:

mapper.readValue(json, Transaction.class); 

第二種選擇 - 你可以寫custom deserializerTransaction類。

+1

太棒了!非常感謝你的答案。最後,我們決定使用TransactionWrapper對象並將@JsonRootName(「transaction」)放在其Transaction字段中,但您的建議看起來非常有趣! –

+0

'TransactionWrapper'聽起來不錯。我也想過。無論如何,您可以重新使用mixin功能來解決未來的其他問題。 –