나는 Flickr API을 사용하고 있습니다. flickr.test.login
메소드를 호출 할 때, 기본 JSON 결과는 다음과 같습니다잭슨 사용자 지정 JSON 비 직렬화
{
"user": {
"id": "[email protected]",
"username": {
"_content": "jamalfanaian"
}
},
"stat": "ok"
}
내가 자바 객체로이 응답 구문 분석하고 싶습니다
:
public class FlickrAccount {
private String id;
private String username;
// ... getter & setter ...
}
json으로 속성은 다음과 같이 매핑되어야한다 :
"user" -> "id" ==> FlickrAccount.id
"user" -> "username" -> "_content" ==> FlickrAccount.username
아쉽게도 특수 효과를 사용하여 멋지고 우아한 방법을 찾을 수 없습니다. 지금까지의 나의 접근 방식은 JSON String을 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 ...
}
감사합니다. 내가 빠뜨린 부분은 주석이었습니다. 객체가 모듈에 등록 된 유형의 서브 클래스 임에도 불구하고 @JsonDeserialize 주석을 제공해야했습니다. – th3morg