我使用的是Flickr API。當調用flickr.test.login
方法,默認JSON的結果是:Jackson的自定義JSON反序列化操作
{
"user": {
"id": "[email protected]",
"username": {
"_content": "jamalfanaian"
}
},
"stat": "ok"
}
我想解析這個響應轉換成Java對象:
public class FlickrAccount {
private String id;
private String username;
// ... getter & setter ...
}
的JSON屬性應該被映射這樣的:
"user" -> "id" ==> FlickrAccount.id
"user" -> "username" -> "_content" ==> FlickrAccount.username
不幸的是,我無法找到一個不錯的,優雅的方式來做到這一點使用註釋。到目前爲止,我的方法是將JSON字符串讀入Map<String, Object>
並從那裏獲取值。
Map<String, Object> value = new ObjectMapper().readValue(response.getStream(),
new TypeReference<HashMap<String, Object>>() {
});
@SuppressWarnings("unchecked")
Map<String, Object> user = (Map<String, Object>) value.get("user");
String id = (String) user.get("id");
@SuppressWarnings("unchecked")
String username = (String) ((Map<String, Object>) user.get("username")).get("_content");
FlickrAccount account = new FlickrAccount();
account.setId(id);
account.setUsername(username);
但我認爲,這是最不優雅的方式,永遠。有沒有簡單的方法,使用註釋或自定義的Deserializer?
這將是對我來說非常明顯,當然這是行不通的:
public class FlickrAccount {
@JsonProperty("user.id") private String id;
@JsonProperty("user.username._content") private String username;
// ... getter and setter ...
}
謝謝。我在這裏失蹤的部分是註釋。儘管對象是在模塊中註冊的類型的子類,但我必須提供@JsonDeserialize註釋。 – th3morg