我目前正在嘗試開發與某個在線服務進行通信的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