Tôi đang sử dụng Flickr API. Khi gọi phương thức flickr.test.login
, kết quả JSON mặc định là:Tùy chỉnh JSON Deserialization với Jackson
{
"user": {
"id": "[email protected]",
"username": {
"_content": "jamalfanaian"
}
},
"stat": "ok"
}
Tôi muốn phân tích phản ứng này vào một đối tượng Java:
public class FlickrAccount {
private String id;
private String username;
// ... getter & setter ...
}
Các thuộc tính JSON nên được ánh xạ như thế này:
"user" -> "id" ==> FlickrAccount.id
"user" -> "username" -> "_content" ==> FlickrAccount.username
Thật không may, tôi không thể tìm thấy cách tốt đẹp, thanh lịch để thực hiện việc này bằng Chú thích. Cách tiếp cận của tôi cho đến nay là đọc chuỗi JSON vào một số Map<String, Object>
và nhận các giá trị từ đó.
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);
Nhưng tôi nghĩ, đây là cách không thanh lịch nhất từ trước tới nay. Có cách nào đơn giản, hoặc bằng cách sử dụng chú thích hoặc Deserializer tùy chỉnh?
Đây sẽ là rất rõ ràng đối với tôi, nhưng tất nhiên nó không hoạt động:
public class FlickrAccount {
@JsonProperty("user.id") private String id;
@JsonProperty("user.username._content") private String username;
// ... getter and setter ...
}
Cảm ơn bạn. Phần mà tôi đã bỏ lỡ ở đây là chú thích. Tôi đã cung cấp chú thích @JsonDeserialize mặc dù đối tượng là một lớp con của một loại được đăng ký trong một mô-đun. – th3morg