java - Jackson JSON 无法反序列化具有自定义根名称的元素数组?

标签 java arrays json jackson deserialization

我有一个如下所示的 Json:

{
  "testEntities" : [ {
    "id" : 1,
    "floatNumber" : 0.006117165,
    "floatNumberObject" : 0.15273619,
    "intNumber" : -1155869325,
    "intNumberObject" : 431529176,
    "doubleNumber" : 0.41008081149220166,
    "doubleNumberObject" : 0.20771484130971707,
    "shortNumber" : 9364,
    "shortNumberObject" : 13977,
    "booleanValue" : true,
    "booleanValueObject" : true,
    "byteValue" : -79,
    "charValue" : "e",
    "charValueObject" : "b",
    "creationDate" : 86400000
  }, {
    "id" : 2,
    "floatNumber" : 0.9874208,
    "floatNumberObject" : 0.45285606,
    "intNumber" : -1154715079,
    "intNumberObject" : 1260042744,
    "doubleNumber" : 0.9014476240300544,
    "doubleNumberObject" : 0.49682259343089075,
    "shortNumber" : 483,
    "shortNumberObject" : 18322,
    "booleanValue" : false,
    "booleanValueObject" : true,
    "byteValue" : -73,
    "charValue" : "c",
    "charValueObject" : "r",
    "creationDate" : 172800000
  } ]
}

当我尝试反序列化它时,它失败了:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Root name 'testEntities' does not match expected ('TestObject[]') for type

我已经启用了数组反序列化:

objectMapper.enable(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY);

显然,testEntities这是 jackson 一无所知的自定义名称。 TestObject类有一个我创建的自定义注释,名为 JsonRootNamePlural ,当根元素是集合而不是单个实例时使用:

@JsonRootName("testEntity")
@JsonRootNamePlural("testEntities")
public class TestObject {
   ...
}

系统的其他地方也需要这个注释。

我希望它像使用 @JsonRootName 一样使用它注释,除了数组。因此它可以查找 JsonRootName 指示的根元素,如果没有找到,它可以查找 @JsonRootNamePlural。 Jackson 应忽略 JSON 中的所有其他根名称。

问题是,我应该重写或自定义什么来引入此行为?

非常感谢任何帮助或指示,谢谢!!

最佳答案

找到了我自己问题的答案:需要在对象映射器上设置一个 JacksonAnnotationIntrospector 的自定义实例,它覆盖 findRootName 方法,并检查该类是否是array,如果是的话,在数组组件类中查找自定义注释,如下所示:

    @Override
    public PropertyName findRootName(AnnotatedClass ac) {
        // if this is an array, look for JsonRootNamePlural annotation in
        // the base type for the array (the so called array component)
        if (ac.getRawType().isArray()) {
            Class<?> arrayComponent = ac.getRawType().getComponentType();

            JsonRootNamePlural ann = arrayComponent.getAnnotation(JsonRootNamePlural.class);
            if (ann != null) {
                return PropertyName.construct(ann.value(), null);
            }

        }

        // super class will look for default @JsonRootName annotation
        return super.findRootName(ac);
    }

希望这对其他人有帮助,

干杯!

关于java - Jackson JSON 无法反序列化具有自定义根名称的元素数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983024/

相关文章:

java - 通过 Wi-Fi 连接从 Android 向 PC 发送文本

Java Swing如何对自定义画作分层

Ruby:如何添加到数组的新哈希?

java - 3D 数组中的 ArrayIndexOutOfBoundsException

java - 使用 JPA/Hibernate 最小化 JSON 以反序列化和持久化复杂的 POJO

java - JSP 自定义标签库 : Nested Evaluation

java - 可靠的数据服务

java - 我试图让我的程序继续请求输入并回答该输入

json - @JsonRootName 不起作用

javascript - JSON ajax post 数据 - 收到 400 错误请求消息