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

时间:2019-02-03 16:15:09

标签: java json-deserialization jackson2

我想反序列化一个用@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]

仅当该对象是JSON文件中的唯一属性时,显然@JsonRootName的对象进行反序列化才有效-因为它不希望"lastTransactionID"在那里。

这是我的Account班:

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

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

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

由于我使用的是弹簧,因此我也进行了spring.jackson.deserialization.unwrap_root_value=true的设置。

有没有什么办法可以解决这个问题?

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

OR

  • 在反序列化发生之前拦截响应并剥离掉多余的属性?

3 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法似乎是为Account类创建包装器,并使用禁用的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES功能照常反序列化json。

public static class Wrapper {
    public Account account;
}

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

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

答案 1 :(得分:0)

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

data_clean %>%
  mutate(age_years = as.numeric(age_years))

答案 2 :(得分:0)

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