gpt4 book ai didi

java - 使用 Jackson 自定义 JSON 反序列化

转载 作者:IT老高 更新时间:2023-10-28 12:51:52 25 4
gpt4 key购买 nike

我正在使用 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 属性应该像这样映射:

"user" -> "id" ==> FlickrAccount.id
"user" -> "username" -> "_content" ==> FlickrAccount.username

不幸的是,我无法找到一种使用 Annotations 的漂亮、优雅的方式来执行此操作。到目前为止,我的方法是将 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 ...
}

最佳答案

您可以为此类编写自定义反序列化程序。它可能看起来像这样:

class FlickrAccountJsonDeserializer extends JsonDeserializer<FlickrAccount> {

@Override
public FlickrAccount deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Root root = jp.readValueAs(Root.class);

FlickrAccount account = new FlickrAccount();
if (root != null && root.user != null) {
account.setId(root.user.id);
if (root.user.username != null) {
account.setUsername(root.user.username.content);
}
}

return account;
}

private static class Root {

public User user;
public String stat;
}

private static class User {

public String id;
public UserName username;
}

private static class UserName {

@JsonProperty("_content")
public String content;
}
}

之后,您必须为您的类定义一个反序列化器。你可以这样做:

@JsonDeserialize(using = FlickrAccountJsonDeserializer.class)
class FlickrAccount {
...
}

关于java - 使用 Jackson 自定义 JSON 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19158345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com