java - 使用 Jackson 反序列化要列出的重复键

标签 java json spring-boot jackson

我正在尝试将 json 反序列化为对象。但是,json 有重复的键。我无法更改 json,我想使用 Jackson 将重复键更改为列表。

这是我检索的 json 示例:

{
  "myObject": {
    "foo": "bar1",
    "foo": "bar2"
  }
}

这是反序列化后我想要的:

{
  "myObject": {
    "foo": ["bar1","bar2"]
  }
}

我这样创建了我的类:

public class MyObject {
    private List<String> foo;
    // constructor, getter and setter
}

我尝试使用 objectMapper 中的 DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY 但它所做的只是获取最后一个键并将其添加到列表中,如下所示:

{
  "myObject": {
    "foo": ["bar2"]
  }
}

这是我的objectMapper配置:

new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

有没有一种方法可以使用 Jackson 将重复键反序列化到列表中?

最佳答案

需要使用com.fasterxml.jackson.annotation.JsonAnySetter注解:

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        Root root = mapper.readValue(jsonFile, Root.class);
        root.getMyObject().getFoos().forEach(System.out::println);
    }
}

class Root {

    private MyObject myObject;

    // getters, setters, toString
}

class MyObject {

    private List<String> foos = new ArrayList<>();

    @JsonAnySetter
    public void manyFoos(String key, String value) {
        foos.add(value);
    }

    // getters, setters, toString
}

Java 端,您有一个包含值的列表:

bar1
bar2

关于java - 使用 Jackson 反序列化要列出的重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61528937/

相关文章:

java - 如何在 spring boot 中使用非密码保护 (.p12) ssl 证书

java - 如何修复此错误 "JSON parse error: Cannot deserialize instance of ` java.lang.Integer` out of START_OBJECT

java - 如何使用java代码密码保护xls文件

java - 是否可以读取同一个 xlsx 文件中不同工作表的数据?

java - JAVA制作存钱 jar 程序

java - 亚型多态性成分

javascript - 在 Javascript 中通过页面刷新维护对弹出窗口的引用

c# - 如何反序列化 JSON 数据?

javascript - 使用嵌套 json 时,排序在 ngTable 中不起作用

logback.xml 的 Spring 环境到系统属性