通过RestTemplate postForObject将JSON叶映射到对象

时间:2014-06-15 02:58:16

标签: java json spring rest jackson

使用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

1 个答案:

答案 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}