使用 Jackson 反序列化重复键以列出

Jso*_*raz 3 java json jackson spring-boot

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

这是我检索的 json 的示例:

{
  "myObject": {
    "foo": "bar1",
    "foo": "bar2"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "myObject": {
    "foo": ["bar1","bar2"]
  }
}
Run Code Online (Sandbox Code Playgroud)

我像这样创建了我的课程:

public class MyObject {
    private List<String> foo;
    // constructor, getter and setter
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "myObject": {
    "foo": ["bar2"]
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的objectMapper配置:

new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 Jackson 将重复的键反序列化到列表中?

Mic*_*ber 5

您需要使用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
}
Run Code Online (Sandbox Code Playgroud)

Java旁边你有一个包含值的列表:

bar1
bar2
Run Code Online (Sandbox Code Playgroud)