我用的是Flickr API当调用flickr.test.login
方法时,默认的JSON结果是:
{
"user": {
"id": "21207597@N07",
"username": {
"_content": "jamalfanaian"
}
},
"stat": "ok"
}
我想把这个响应解析成一个Java对象:
public class FlickrAccount {
private String id;
private String username;
// ... getter & setter ...
}
JSON属性应该像这样Map:
"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 ...
}
6条答案
按热度按时间quhf5bfb1#
你可以为这个类编写自定义的编译器。它可以看起来像这样:
之后,你必须为你的类定义一个转换器。您可以按如下方式执行此操作:
dfddblmv2#
因为我不想实现一个自定义类(
Username
)来Map用户名,所以我使用了一种更优雅但仍然很难看的方法:它仍然没有我希望的那么优雅,但至少我摆脱了所有丑陋的铸造。这个解决方案的另一个优点是,我的域类(
FlickrAccount
)没有被任何Jackson注解污染。根据@ MichaelZiober的回答,我决定使用-在我看来-最直接的解决方案。使用
@JsonDeserialize
注解和自定义的解析器:但是,解析器不使用任何内部类,只使用上面的
JsonNode
:mi7gmzs63#
您也可以使用SimpleModule。
zbsbpyhn4#
我是这样做的:
sbdsn5lh5#
ktca8awb6#
您必须在FlickrAccount中将URL设置为一个类,并为它给予一个_content字段