我正在尝试将 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/