我目前正在尝试开发与某个在线服务进行通信的REST客户端。这个在线服务返回一些我希望映射到Java对象的JSON响应,使用Jackson。将JSON映射为具有单属性和多属性的多态POJO
JSON响应的一个例子是:
{
"id" : 1,
"fields" : [ {
"type" : "anniversary",
"value" : {
"day" : 1,
"month" : 1,
"year" : 1970
}
}, {
"type" : "birthday",
"value" : {
"day" : 1,
"month" : 1,
"year" : 1970
}
}, {
"type" : "simple",
"value" : "simple string"
},{
"type": "name",
"value": {
"firstName": "Joe",
"lastName": "Brown"
}
} ]
}
注意以下几点:
- 该结构包含一个简单的ID,和场实例的集合,每一个都具有类型和值
- 值结构由外部公式确定operty 型 在给出的例子中
- ,有3种类型 - >日期,名称,及单值串
- 的生日和周年类型二者匹配日期结构
- 有几类映射到一个字符串值,如电子邮件类型,twitterId类型,公司型等
我的问题是,我似乎并没有能够正确地映射这种结构的Java对象
这是我到目前为止已经完成。以下是课程和他们的杰克逊注释(吸气剂和吸附剂被省略)。
public class Contact {
private int id;
private List<Field> fields;
}
public class Field {
private FieldType type;
private FieldValue value;
}
public enum FieldType {
EMAIL, NICKNAME, NAME, ADDRESS, BIRTHDAY, ANNIVERSARY
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type",
defaultImpl = SingleFieldValue.class)
@JsonSubTypes({
@JsonSubTypes.Type(value = NameFieldValue.class, name = "name"),
@JsonSubTypes.Type(value = DateFieldValue.class, name = "anniversary"),
@JsonSubTypes.Type(value = DateFieldValue.class, name = "birthday"),
@JsonSubTypes.Type(value = SingleFieldValue.class, name = "nickname"),
@JsonSubTypes.Type(value = SingleFieldValue.class, name = "email"),
//other types that map to SingleFieldValue
})
public abstract FieldValue {
}
public class NameFieldValue extends FieldValue {
private String firstName;
private String lastName;
}
public class DateFieldValue extends FieldValue {
private int day;
private int month;
private int year;
}
public class SingleFieldValue extends FieldValue {
private String value;
}
的ObjectMapper不包含任何配置,则使用默认配置。
你有什么建议要正确映射这些?我想避免制作自定义的反序列化器,而只是遍历Json对象,比如JsonNode。
备注:对于缺乏足够明确的信息,我提前道歉。请说明我的配方有任何问题。
你有没有考虑过简单地写一些软件来做到这一点? – 2014-12-03 13:05:35
我的愿望是使用杰克逊解开JSON。我想这就是你所指的。 – 2014-12-03 13:12:14
将'value'作为Map并对其进行排序。你可以离开休息。 – 2014-12-03 13:13:36