使用restful api返回一个json字符串。格式为
{
"status": "ok",
"result": { <the method result> }
}
我正在尝试将用户个人资料的响应映射到UserProfile.class
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>();
parameters.set("method", "currentUser");
URI url = buildUri("users/show.json");
UserProfile profile = this.getRestTemplate().postForObject(url, parameters, UserProfile.class );
用户个人资料包含响应结果中的所有字段。如果我添加字段字符串状态,UserProfile结果,它将UserProfile映射到结果,我可以从那里提取它,但这感觉有点不对。
我希望postForObject函数映射JSON响应相关的叶子&#34;结果&#34;到UserProfile.class
答案 0 :(得分:2)
对我来说,最明智的方法是将响应结果映射到包含用户配置文件对象的对象。您可以避免不必要的复杂化进行自定义反序列化,并允许您访问状态代码。您甚至可以将响应结果对象设为通用,以便它适用于任何类型的内容。
以下是使用Jackon的对象映射器的示例。在Spring中,您需要使用ParameterizedTypeReference
来传递泛型类型信息(请参阅this answer):
public class JacksonUnwrapped {
private final static String JSON = "{\n" +
" \"status\": \"ok\",\n" +
" \"result\": { \"field1\":\"value\", \"field2\":123 }\n" +
"}";
public static class Result<T> {
public final String status;
public final T result;
@JsonCreator
public Result(@JsonProperty("status") String status,
@JsonProperty("result") T result) {
this.status = status;
this.result = result;
}
@Override
public String toString() {
return "Result{" +
"status='" + status + '\'' +
", result=" + result +
'}';
}
}
public static class UserProfile {
public final String field1;
public final int field2;
@JsonCreator
public UserProfile(@JsonProperty("field1") String field1,
@JsonProperty("field2") int field2) {
this.field1 = field1;
this.field2 = field2;
}
@Override
public String toString() {
return "UserProfile{" +
"field1='" + field1 + '\'' +
", field2=" + field2 +
'}';
}
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
Result<UserProfile> value = mapper.readValue(JSON, new TypeReference<Result<UserProfile>>() {});
System.out.println(value.result);
}
}
输出:
UserProfile{field1='value', field2=123}