Я использую Flickr API. При вызове метода flickr.test.login
результат 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);
Но я думаю, что это самый не элегантный способ, когда-либо. Есть ли простой способ, используя аннотации или пользовательский десериализатор?
Это было бы очень очевидно для меня, но, конечно, это не сработало:
public class FlickrAccount {
@JsonProperty( "user.id" ) private String id;
@JsonProperty( "user.username._content" ) private String username;
// ... getter and setter ...
}