JSON Jackson将多个密钥反序列化到同一字段中 [英] JSON Jackson deserialization multiple keys into same field
问题描述
我正在尝试将JSON转换为POJO. 我曾与Jackson一起转换标准JSON文件. 在这种特殊情况下,我想将键值覆盖为默认"类/变量.在这种情况下,有多个要替换的键值(即数百个,并且要替换的键值未知).
I am trying to convert JSON into POJO. I have worked with Jackson to convert standard JSON file. In this particular case, I would like to overwrite the key value to "default" class/variable. In this case, there are multiple key value to be replaced (ie. hundreds, and the key values to be replaced are unknown).
这可能吗?我本来打算将其存储到Map中,然后将每个对象迭代并存储到POJO中,但是想知道是否存在其他选择,因为我不熟悉将JSON存储到Map中.
Is this possible? I thought of storing it into Map, then iterate and store each into POJO, but wondering if there is different option, since I am not that familiar with storing JSON to Map.
要处理的JSON示例:
Example of the JSON to be processed:
"People" : {
"person1" : {
"name" : "john doe",
"address" : "123 main st",
"email" : "john@doe.com"
},
"person2" : {
"name" : "bob cat",
"address" : "234 dog st",
"email" : "bob@cat.com"
},
"person3" : {
"name" : "foo bar",
"address" : "111 1st ave",
"email" : "foo@bar.com"
},
"person8" : {
"name" : "james bono",
"address" : "999 alaska st",
"email" : "james@bono.com"
}
}
是否可以按以下结构生成类?主要问题是要替换成百上千的价值,并且假设它们是未知的,我不能使用这种方法.
Is it possible to generate the class in the following structure? The main issue is there are hundreds of value to be replaced and assuming they are unknown, I can't use this approach.
@JsonIgnoreProperties(ignoreUnknown = true)
public class People {
@JsonAlias({"person1", "person2"})
private List<Details> person; // --> this should be the default replacing person1, person2, and so on
private class Details {
String name;
String address;
String email;
}
}
推荐答案
You can use JsonAnySetter annotation for all properties personXYZ
. See below example:
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
System.out.println(mapper.readValue(jsonFile, People.class).getPersons());
}
}
class People {
private List<Details> persons = new ArrayList<>();
@JsonAnySetter
public void setPerson(String name, Details person) {
this.persons.add(person);
}
public List<Details> getPersons() {
return persons;
}
public static class Details {
String name;
String address;
String email;
// getters, setters, toString
}
}
对于上面的JSON
代码,打印:
For your JSON
above code prints:
[Details{name='john doe', address='123 main st', email='john@doe.com'}, Details{name='bob cat', address='234 dog st', email='bob@cat.com'}, Details{name='foo bar', address='111 1st ave', email='foo@bar.com'}, Details{name='james bono', address='999 alaska st', email='james@bono.com'}]
如果使用内部类,请记住将其设置为public static
,以使其对Jackson
实例化过程可见.
In case you use inner class remember to make it public static
to make it visible to Jackson
instantiation process.
另请参阅:
- How to use dynamic property names for a Json object
- Jackson Annotation Examples
这篇关于JSON Jackson将多个密钥反序列化到同一字段中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!