[英]Deserialize strings and objects using jackson annotations in java
我当前的json文件如下所示:
{
"root": {
"node1a":[
],
"node1b":[
"foo",
"bar"
]
}
}
和杰克逊反序列化:
@JsonCreator
class DeserializationClass{
Map<String, List<String>> nodes;
DeserializationClass(@JsonProperty("root") final Map<String, List<String>> nodes) {
this.nodes = nodes;
}
}
但是,我想转到一种结构,例如
{
"root": {
"node1a":[
],
"node1b":[
"foo",
"bar",
{
"key1":"value",
"key2":"value"
}
]
}
}
是否可以通过替换使用注释来反序列化:
Map<String, List<String>>
与
Map<String, List<AnotherClass>>?
现在,您的node1b
是对象的混合数组,因此,除非要实现完整的自定义反序列化器,否则,您可以获得的最佳效果是List<Object>
,其中某些对象将是Map
。
您可以使用JsonCreator批注和POJO
项目的两个构造函数。 如果数组中有一个原语,将使用1-arg
构造函数。 对于完全设置的对象,将使用2-arg
构造函数。 看下面的例子:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.List;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(jsonFile, DeserializationClass.class));
}
}
class DeserializationClass {
Map<String, List<AnotherClass>> nodes;
@JsonCreator
DeserializationClass(@JsonProperty("root") final Map<String, List<AnotherClass>> nodes) {
this.nodes = nodes;
}
@Override
public String toString() {
return "DeserializationClass{" +
"nodes=" + nodes +
'}';
}
}
class AnotherClass {
private String key1;
private String key2;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public AnotherClass(@JsonProperty("key1") String value) {
this(value, null);
}
@JsonCreator
public AnotherClass(@JsonProperty("key1") String key1, @JsonProperty("key2") String key2) {
this.key1 = key1;
this.key2 = key2;
}
@Override
public String toString() {
return "AnotherClass{" +
"key1='" + key1 + '\'' +
", key2='" + key2 + '\'' +
'}';
}
}
哪个为您的JSON
有效负载打印:
DeserializationClass{nodes={node1a=[], node1b=[AnotherClass{key1='foo', key2='null'}, AnotherClass{key1='bar', key2='null'}, AnotherClass{key1='value1', key2='value1'}]}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.