Java Jackson使用unwrapping root解析json,但无法设置@JsonRootName

Java Jackson使用unwrapping root解析json,但无法设置@JsonRootName,java,json,jackson,Java,Json,Jackson,rest服务以 <transaction><trxNumber>1243654</trxNumber><type>INVOICE</type></transaction> 我使用时没有问题: mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true) 以及由此产生的阶级 @JsonRootName("transaction") public class

rest服务以

<transaction><trxNumber>1243654</trxNumber><type>INVOICE</type></transaction>
我使用时没有问题:

mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true)
以及由此产生的阶级

@JsonRootName("transaction")
public class Transaction {
private String trxNumber;
private String type;
//getters and setters
}
但实际上,我应该使用第三方jar中的事务类,它与上面完全相同,但是没有@JsonRootName(“Transaction”)注释。

所以我最终得到了

Could not read JSON: Root name 'transaction' does not match expected ('Transaction') for type...
有没有任何方法可以在不向事务类本身添加任何内容的情况下强制Jackson解析事务类(因为我将此文件作为二进制jar的一部分获得)

我尝试过自定义PropertyName策略,但它似乎只涉及字段和getter/setter名称,而不涉及类名

Java7,jackson2.0.5

有什么建议吗?谢谢。

您可以使用该功能完成此操作。您可以像这样创建简单的接口/抽象类:

@JsonRootName("transaction")
interface TransactionMixIn {

}
现在,您必须配置
ObjectMapper
object:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
mapper.addMixInAnnotations(Transaction.class, TransactionMixIn.class);
最后,您可以使用它来反序列化JSON:

mapper.readValue(json, Transaction.class);

第二个选项-您可以为
事务编写
类。

太好了!非常感谢你的回答。最后,我们决定使用TransactionWrapper对象,并将@JsonRootName(“transaction”)放在其事务字段中,但您的建议看起来非常有趣<代码>事务包装器
听起来不错。我也想过。无论如何,您可以重用mixin特性来解决将来的另一个问题。
mapper.readValue(json, Transaction.class);