当前位置: 首页 > 面试题库 >

杰克逊用解包的根解析JSON,但没有设置@JsonRootName的能力

鲜于浩淼
2023-03-14
问题内容

其余服务响应

<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 / html" target="_blank">setter名称有关,而与类名称无关。

Java7,杰克逊2.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



 类似资料:
  • 问题内容: 它应该是如此简单,但是在尝试一个小时的尴尬之后,我只是找不到它。 我需要获取一个JSON字符串,例如,解析为。 给 问题答案: 理查兹的答案略有不同,但可以使用字符串,因此可以将其简化为:

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 我试图使用jackson来序列化和反序列化一个POJO。从POJO到JSON可以很好地工作,但是反过来就不行了。 我有一个POJO 并运行和测试我运行的包calendar.model 引发异常 我已经尽我所能让JSON到POJO工作,但它不会。如果我从JSON映射到map类型,它确实有效。 感谢您的帮助 这是我的依赖项中杰克逊的 grep 看起来除了jackson2,没有其他版本的jackson了

  • 问题内容: 我有以下json文件: 但是java模型如下: Jackson解析时会引发异常,因为“ externalId”字段没有getter或setter方法。有没有可以用来忽略json字段的装饰器? 问题答案: 您可以使用注释;如果这只是您要跳过的一个值,则类似于: 或忽略任何无法使用的东西: 还有其他方法可以做到这一点,其余的请查看FasterXML Jackson wiki 。

  • 问题内容: 我有一个下面的JSON,我需要从中制作一个。在下面的JSON中,我只有3个级别,但通常可以更高,有时也可以更低。 我图的关键是它的部分和值应是最后。 现在我可以嵌套在其中,因此在为此创建POJO时遇到问题。我可以有一个级别,也可以嵌套在每个级别中,而我总是需要获取最后一个的ID 。 因此,我通过转到jsonschema2pojo来为此创建一个POJO,并提供了JSON,它在其中生成了我

  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似