Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson使用@JsonRootName反序列化JSON,并提供额外属性_Java_Json Deserialization_Jackson2 - Fatal编程技术网

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”
属性。您的解决方案实际上是一个自定义反序列化程序(顺便说一句,我最终使用了它),但在我的问题中,我明确指出:有没有办法解决这个问题而不必编写自定义反序列化程序?