对于我的Java Sping Boot 应用程序(v2.7.12),我使用restTemplate.exchange()
执行GET请求,该请求传入正确的url
,带有正确头部的HttpEntity
和响应类型Profile.class
。
它将此值分配给ResponseEntity<Profile> response
ResponseEntity<Profile> response = restTemplate.exchange(url, HttpMethod.GET, httpEntity, Profile.class);
现在,当我把它赋给String类型时:ResponseEntity<String> response
而不是Profile,response.getBody()
返回正确的json主体,以及正确的数据:name: random
<200,{"user":{"username='instagram', full_name='instagram'}
但是,当我将其分配给配置文件类型时:ResponseEntity<Profile> response
,它返回正确的json主体,但带有无效数据:name: null
<200,{"user":{"username='null', full_name='null'}
我想做的是将确切的API属性分配给我的Profile模型类,而不需要自己解析JSON的HTML类型。
@JsonIgnoreProperties(ignoreUnknown = false)
public class Profile {
@JsonProperty("username")
private String username;
@JsonProperty("full_name")
private String full_name;
@JsonProperty("is_private")
private boolean is_private;
@JsonProperty("status")
private String status;
@JsonProperty("profile_pic_url")
private String profile_pic_url;
@JsonProperty("follower_count")
private int follower_count;
@JsonProperty("following_count")
private int following_count;
@JsonProperty("biography")
private String biography;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
这是我的restTemplate:
@Controller
public class WebController {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
我知道这个问题有一个简单的解决方法。我已经尝试使用JacksonAPI从String类型的响应体中解析JSON,但我希望这是B计划。
我试过改变URL格式,但没有什么区别。标题很好。API本身并没有错。
Profile profile = restTemplate.getForObject(uri, Profile.class)
我尝试使用.getForObject
,它以前工作过,但我需要传入头,它不能这样做。
1条答案
按热度按时间rkttyhzu1#
JSON有一个名为
user
的根元素。您正在尝试反序列化,假设没有根元素。这就是为什么它不起作用,Jackson试图在根上找到Profile
类的字段,但它从未找到任何字段,因为它们被 Package 到另一个对象中。首先,以这种方式配置
ObjectMapper
(最好将此代码放在@Configuration
注解类中:这将告诉对象Map器允许使用根值进行反序列化。
现在,用
@JsonRootName
注解Profile
类:这样,在反序列化时,Jackson将在将JSON反序列化为
Profile
对象之前解包您的值。