Java Jackson使用@JsonRootName反序列化JSON,并提供额外属性
我想反序列化一个用Java Jackson使用@JsonRootName反序列化JSON,并提供额外属性,java,json-deserialization,jackson2,Java,Json Deserialization,Jackson2,我想反序列化一个用@JsonRootName注释的对象。但是,传输对象的JSON包含另一个额外属性。因此,杰克逊抱怨: com.fasterxml.jackson.databind.exc.MismatchedInputException:意外的令牌(字段名称),预期的结束对象:当前令牌不是结束对象(将包装器对象与根名称“account”匹配),但字段名称位于[源:(ByteArrayInputStream);行:1,列:26] 显然,@JsonRootName注释对象的反序列化只有当该对象是J
@JsonRootName
注释的对象。但是,传输对象的JSON包含另一个额外属性。因此,杰克逊抱怨:
com.fasterxml.jackson.databind.exc.MismatchedInputException:意外的令牌(字段名称),预期的结束对象:当前令牌不是结束对象(将包装器对象与根名称“account”匹配),但字段名称位于[源:(ByteArrayInputStream);行:1,列:26]
显然,@JsonRootName
注释对象的反序列化只有当该对象是JSON文件中的唯一属性时才起作用,因为它不希望有“lastTransactionID”
这是我的账户
课程:
@JsonRootName("account")
public class Account {
private String id;
}
这是我需要反序列化的JSON:
{
"account": {
"id": "1234"
},
"lastTransactionID": "1"
}
因为我使用的是spring,所以我还有这个设置spring.jackson.deserialization.unwrap\u root\u value=true
有没有办法解决这个问题而不:
- 必须编写自定义反序列化程序
- 在反序列化发生之前拦截响应并将其从额外属性中剥离
帐户类创建包装器,并像往常一样使用禁用的反序列化功能反序列化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;
}
公共帐户对象(映射){
ObjectMapper ObjectMapper=新的ObjectMapper();
Account Account=objectMapper.convertvalue(map.get(“Account”)、Account.class);
返回帐户;
}
您可以在Account类上使用JsonIgnoreProperties(ignoreUnknown=true)注释。有关更多详细信息,请参阅下面的链接。
这也是我最想避免的解决方案。我有一系列类似的模型,所有这些模型都附带有“lastTransactionId”
属性。您的解决方案实际上是一个自定义反序列化程序(顺便说一句,我最终使用了它),但在我的问题中,我明确指出:有没有办法解决这个问题而不必编写自定义反序列化程序?