繁体   English   中英

Jackson 使用 @JsonRootName 反序列化具有额外属性的 JSON

[英]Jackson deserialize JSON with extra properties using @JsonRootName

我想反序列化一个用@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] 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" - 因为它不希望"lastTransactionID"在那里。

这是我的Account类:

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

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

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

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

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

  • 必须编写自定义解串器?

或者

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

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

public static class Wrapper {
    public Account account;
}

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

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

我们可以使用 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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM