Używam Flickr API. Po wywołaniu metody flickr.test.login
domyślny JSON wynik to:Niestandardowe odserializowanie JSON z Jacksonem
{
"user": {
"id": "[email protected]",
"username": {
"_content": "jamalfanaian"
}
},
"stat": "ok"
}
Chciałbym przeanalizować tę odpowiedź w obiekt Java:
public class FlickrAccount {
private String id;
private String username;
// ... getter & setter ...
}
Właściwości JSON powinny być mapowane następująco:
"user" -> "id" ==> FlickrAccount.id
"user" -> "username" -> "_content" ==> FlickrAccount.username
Niestety, nie jestem w stanie znaleźć przyjemnego, eleganckiego sposobu, aby to zrobić za pomocą Adnotacji. Do tej pory moim podejściem było odczytanie łańcucha JSON w postaci Map<String, Object>
i pobranie z niego wartości.
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);
Ale myślę, że jest to najbardziej nie-elegancki sposób, kiedykolwiek. Czy jest jakiś prosty sposób, korzystając z Adnotacji lub niestandardowego Deserializatora?
Byłoby to bardzo oczywiste dla mnie, ale oczywiście to nie działa:
public class FlickrAccount {
@JsonProperty("user.id") private String id;
@JsonProperty("user.username._content") private String username;
// ... getter and setter ...
}
Dziękuję. Częścią, której mi brakowało, była adnotacja. Musiałem podać adnotację @JsonDeserialize, mimo że obiekt jest podklasą typu zarejestrowanego w module. – th3morg