使用JsonAnySetter批注将具有无限嵌套结构的动态JSON对象映射到Map

问题描述

我想使用自定义结构将JSON Object映射到Java类。 例如:

public class RestAttributesMappingDTO {
    Map<String,Object> details = new LinkedHashMap<>();
    @JsonAnySetter
    void setDetail(String key,Object value) {
        details.put(key,value);
    }
}

如您所见,注释@JsonAnySetter已用于映射。

任何平面结构都可以。

但是如果我想映射具有无限(自定义)嵌套结构的对象?

例如:

{
    name: "",age: "",job: [{
         job1: {  
              title: "",ZIP: ""                   
         }
    }]
}

提出了不使用@JsonAnySetter创建地图的递归算法。

但是有什么方法可以使用Jackson构建此无限嵌套的地图吗?

解决方法

杰克逊默认反序列化:

  • JSON ObjectMap,其中键为String-s。
  • JSON ArrayList的对象或图元。

在您的示例中,您可以保持原样,但在运行时需要强制转换和检查类型。另一种选择是使用com.fasterxml.jackson.databind.JsonNode类和方法可能类似于:

void setDetail(String key,JsonNode value)

但是您甚至可以跳过此方法和@JsonAnySetter批注,并直接在类中使用它:

public class RestAttributesMappingDTO {
    private JsonNode details;
    //getters,setters
}

JsonNode允许迭代key-value对。

查看其他一些相关问题:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...