Jackson使用@JsonRootName使用其他属性反序列化JSON

问题描述 投票:0回答:3

我想反序列化带有@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

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

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

由于我使用弹簧,所以我也有此设置{ "account": { "id": "1234" }, "lastTransactionID": "1" }

没有任何方法可以解决此问题:

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

OR

  • 在反序列化发生之前拦截响应并剥夺它的额外属性?
java json-deserialization jackson2
3个回答
0
投票

看来,解决此问题的最简单方法是为spring.jackson.deserialization.unwrap_root_value=true类创建包装,并照常使用Account功能禁用来反序列化json。

DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES

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

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


0
投票

您可以在Account类上使用JsonIgnoreProperties(ignoreUnknown = true)批注。请参考以下链接了解更多详情。public static class Wrapper { public Account account; }


0
投票

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

https://www.thetechnojournals.com/2019/10/entity-object-conversion-to-dto-object.html
© www.soinside.com 2019 - 2024. All rights reserved.