私はFlickr APIを使用しています。 flickr.test.login
メソッドを呼び出す場合、デフォルトJSONの結果は次のとおりです。ジャンクションのカスタム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 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