杰克逊解析json与unwraping root,但没有能力设置@JsonRootName

时间:2013-10-24 14:34:04

标签: java json jackson

其他服务以

响应
<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。

有什么建议吗?感谢。

1 个答案:

答案 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