我尝试反序列化包含一些标准字段的JSON响应和props
的嵌套对象,其中包含子类属性,例如:
{
"id":"whatever",
"type":"Foo",
"props":
{
"name":"My Name",
"whatever":"Whatever"
}
}
字段id
和type
是标准字段,因此我有一个基类Base
,然后扩展为更具体的类:
public class Base{
private String id;
private String type;
}
public class Foo extends Base{
private String name;
private String whatever;
}
如何让Jackson读取props
对象作为其他字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此任务。
答案 0 :(得分:0)
如果您尝试将props
反序列化为对象属性,则需要向Foo
类添加相应的属性。
E.g:
public class Foo extends Base{
private Bar props;
}
public class Bar {
String name;
String something;
...getters and setters...
}
然后,您将可以通过bar.getName()
和bar.getSomething()
访问JSON中的嵌套属性。
答案 1 :(得分:0)
Foo的自定义反序列化器:
public class FooDeserializer extends JsonDeserializer<Foo> {
@Override
public Foo deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
String id = node.get("id").asText();
String type = node.get("type").asText();
JsonNode props = node.get("props");
String name = props.get("name").asText();
String whatever = props.get("whatever").asText();
return new Foo(id, type, name, whatever); //you need to create this constructor for Foo
}
}
主要方法示例:
public static void main(String[] args) throws IOException {
String json = "{\n" +
" \"id\":\"whatever\",\n" +
" \"type\":\"Foo\",\n" +
" \"props\":\n" +
" {\n" +
" \"name\":\"My Name\",\n" +
" \"whatever\":\"Whatever\"\n" +
" }\n" +
"}";
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Foo.class, new FooDeserializer());
mapper.registerModule(module);
Foo foo = mapper.readValue(json, Foo.class);
}
依赖关系:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>