Ich benutze die Flickr API. Wenn die flickr.test.login
Methode aufrufen, ist die Standard-JSON Ergebnis:Benutzerdefinierte JSON Deserialisierung mit Jackson
{
"user": {
"id": "[email protected]",
"username": {
"_content": "jamalfanaian"
}
},
"stat": "ok"
}
Ich mag würde diese Antwort in ein Java-Objekt analysieren:
public class FlickrAccount {
private String id;
private String username;
// ... getter & setter ...
}
Die JSON Eigenschaften sollte wie folgt zugeordnet werden:
"user" -> "id" ==> FlickrAccount.id
"user" -> "username" -> "_content" ==> FlickrAccount.username
Leider kann ich nicht eine nette, elegante Möglichkeit, dies mithilfe von Anmerkungen zu finden. Mein Ansatz ist bisher, den JSON String in eine Map<String, Object>
einzulesen und die Werte von dort abzurufen.
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);
Aber ich denke, das ist die meisten nicht-elegante Art und Weise, überhaupt. Gibt es einen einfachen Weg, entweder mit Anmerkungen oder einem benutzerdefinierten Deserializer?
Dies würde für mich sehr offensichtlich, aber natürlich ist es nicht funktioniert:
public class FlickrAccount {
@JsonProperty("user.id") private String id;
@JsonProperty("user.username._content") private String username;
// ... getter and setter ...
}
Danke. Der Teil, der mir darin fehlte, war die Anmerkung. Ich musste die Annotation @ JsonDeserialize angeben, obwohl das Objekt eine Unterklasse eines in einem Modul registrierten Typs ist. – th3morg