我是新來的傑克遜,並有通用字段反序列化JSON的問題。這是我想用Jackson解析的JSON。如何在運行時泛型中使用Jackson?
{
"topic": {
"headline": {
...
},
"body": [
{
"type": "complex",
"content": {
"player_template": "12345",
"width": 600,
"height": 338,
"url": "http://...",
"caption": "foobar",
"vid": "12345",
"watch_url": "http://...",
"embed_html": "<script..."
},
"preview_image_url": "https://...",
"position": 0
},
{
"content": "foobar",
"type": "simple",
"position": 1
}
],
"type": "some type",
"part": "image",
"box_link": [
{
...
},
...
]
}
}
注意
topic > body > element[0] > content
是object
,但topic > body > element[1] > content
是string
。 body
元素可能只包含string
或object
或兩者。
這裏是針對body
和content
的Java類。
public class Body<T> {
// @JsonDeserialize(using = ContentDeserializer.class)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = String.class, name = "simple"),
@JsonSubTypes.Type(value = Content.class, name = "complex")
})
@JsonProperty("content")
private T mContent;
@JsonProperty("type")
private String mType;
@JsonProperty("preview_image_url")
private String mPreviewImageUrl;
@JsonProperty("position")
private int mPosition;
// getter and setter
}
public class Content {
@JsonProperty("player_template")
private String mPlayerTemplate;
@JsonProperty("width")
private int mWidth;
@JsonProperty("height")
private int mHeight;
@JsonProperty("url")
private String mUrl;
@JsonProperty("caption")
private String mCaption;
@JsonProperty("vid")
private String mVid;
@JsonProperty("watch_url")
private String mWatchUrl;
@JsonProperty("embed_html")
private String mEmbedHtml;
// getter and setter
}
我嘗試映射JSON使用JsonSubTypes
批註POJO,所以如果type
等於complex
然後JSON應該被映射到Content
類,對於simple
類型的映射類應該是String
對象。問題是,傑克遜轉換complex
內容到LinkedHashMap
我不想要的。對於simple
內容沒有問題,它將被轉換爲String
,但我認爲傑克遜使用內部邏輯來映射這種正確的方式。
如果我嘗試使用JsonDeserialize
註釋,則不會調用解串器方法。這就像傑克遜忽視註釋並做出自己的工作。
我在哪裏犯了一個錯誤?我應該怎麼做才能解析complex
內容到Content
POJO?
感謝您的解釋,但不幸的是它給出了相同的結果'LinkedHashMap'。 – user2319066