其他服务以
响应<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...
有没有办法强制Jackson解析到Transaction类而不向Transaction类本身添加任何东西(因为我将此文件作为二进制jar的一部分)?
我尝试过自定义PropertyNamingStrategy,但似乎只能使用字段和getter / setter名称,而不是类名。
Java7,Jackson 2.0.5。
有什么建议吗?感谢。
答案 0 :(得分: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);
第二个选项 - 您可以为Transaction
课程编写custom deserializer。