【问题标题】:Jackson deserialize JSON with extra properties using @JsonRootNameJackson 使用 @JsonRootName 反序列化带有额外属性的 JSON
【发布时间】:2019-06-27 12:41:15
【问题描述】:

我想反序列化一个带有@JsonRootName 注释的对象。然而,传输对象的 JSON 包含另一个额外的属性。结果杰克逊抱怨:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (FIELD_NAME), expected END_OBJECT: Current token not END_OBJECT (to match wrapper object with root name 'account'), but FIELD_NAME at [Source: (ByteArrayInputStream); line: 1, column: 26]。

显然,@JsonRootName 注释对象的反序列化仅在该对象是 JSON 文件中的唯一属性时才有效 - 因为它不期望 "lastTransactionID" 存在。

这是我的Account 课程:

@JsonRootName("account")
public class Account {
    private String id;
}

这是我需要反序列化的 JSON:

{
  "account": {
    "id": "1234"
  },
  "lastTransactionID": "1"
}

因为我使用的是 spring,所以我也有这个设置 spring.jackson.deserialization.unwrap_root_value=true。

有没有办法解决这个问题:

  • 必须编写自定义反序列化程序?

或

  • 在反序列化发生之前拦截响应并剥离它的额外属性?

【问题讨论】:

    标签: java json-deserialization jackson2


    【解决方案1】:

    看起来解决此问题的最简单方法是为 Account 类创建包装器,并像往常一样反序列化 json,并禁用 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 功能。

    public static class Wrapper {
        public Account account;
    }
    

    在这种情况下,其他字段将被忽略。

    这不是一个好的解决方案,我知道,但它解决了一个问题。

    【讨论】:

    • 这也是我最想避免的解决方案。我有一堆类似的模型,都带有"lastTransactionId"属性。
    【解决方案2】:

    我们可以使用 ObjectMapper 将 json 映射到 java 对象。

    public Account jsonToObject(Map<String, Object> map){
        ObjectMapper objectMapper = new ObjectMapper();
        Account account = objectMapper.convertvalue(map.get("account"),Account.class);
        return account;
    }
    

    【讨论】:

    • 您的解决方案实际上是一个自定义反序列化器(顺便说一句,我最终使用了它)但在我的问题中我明确指出:有没有办法解决这个问题而不必编写自定义反序列化器?
    【解决方案3】:

    您可以在您的 Account 类上使用 JsonIgnoreProperties(ignoreUnknown=true) 注释。详情请参考以下链接。
    https://www.thetechnojournals.com/2019/10/entity-object-conversion-to-dto-object.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2020-01-25
      • 1970-01-01
      相关资源
      最近更新 更多