6

其余服务响应

<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
}

但实际上我应该使用第 3 方 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,杰克逊 2.0.5。

有什么建议么?谢谢。

4

1 回答 1

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

于 2013-10-25T22:42:29.960 回答