使用Spring RestTemplate将嵌套的JSON对象映射到Java类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Spring RestTemplate将嵌套的JSON对象映射到Java类相关的知识,希望对你有一定的参考价值。

我知道这可能很简单。但是,我无法让它发挥作用。

所以我试图使用Spring RestTemplate来映射我的JSON数据。我有一个来自休息电话的JSON响应。

{
  "message":"ok",
  "status":"ok",
  "data":[
      {"Name":"Yo",
       "Address":"100 Test Rd"},
      {...},
      {...}
   ]
}

这是我试图将它映射到的类。

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {

  private String message;
  private String status;
  private List<Data> data;

  // I could also use a array instead
  // private Data[] data;
}

这是我的Data类:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Data implements Serializable {

  private String Name;
  private String Address;
}

这是我用来调用RestTemplate的代码:

public Reponse getResponse() {
    ResponseEntity<Reponse> responseEntity = restTemplate.getForEntity(Url, Reponse.class);

    return responseEntity.getBody();
}

现在问题来了。我能够获得“消息”和“状态”,但是当我尝试记录/打印数据时,它显示为null。不完全确定这里发生了什么。我真的可以用一些帮助。谢谢。

答案

我有一个类似的问题,RestTemplate也没有将嵌套的JSON对象映射到我的类模型,经过很多挫折我决定使用RestTemplate将我的JSON检索为String(而不是直接转换为我的目标对象),然后使用google Gson库将我的String转换为我的目标实体。

pom.hml

<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>

调用RestTemplate的代码:

 ResponseEntity<String> responseEntity = restTemplate.getForEntity(Url,String.class);
Gson gson = new GsonBuilder().create();
Response reponse = gson.fromJson(responseEntity , Response.class);

不幸的是我无法找到为什么我的嵌套对象没有使用RestTemplate首先映射,但我希望这个解决方法有所帮助!

另一答案

我遇到了同样的问题。用@JsonProperty注释:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Data implements Serializable {

    @JsonProperty("Name")
    private String name;

    @JsonProperty("Address")
    private String address;

    // getters / setters for name and address

}

你的Data类的字段现在应该填充,你可以命名你的字段独立于JSON表示(例如name而不是Name)。

另一答案

使用Rest Template从REST API读取Json数据时,我遇到了类似的问题。解决List的声明getter和setter:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {

  private String message;
  private String status;
  private List<Data> data;

 // getters and Setters for the list. 


}

RestTemplate将在内部将列表数组中的值映射到相应的数组。

另一答案

使用@JsonUnwrapped注释属性“data”,如下所示

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {
    private String message;
    private String status;
    @JsonUnwrapped
    private List<Data> data;
}
另一答案

请使用private List<Data> data = new AllarList<Data>( );并请在这两个类中提供getters()和setters()方法。

@JsonInclude(Include.NON_EMPTY)放在Data类之上

请在主POM.xml文件的部分下添加以下依赖项并进行maven编译。然后我猜你的问题会得到解决。

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-joda</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.8.8</version>
        </dependency>
另一答案

我知道这是一个老线程。

但是对于任何有相同问题的人,你可以将杰克逊用于MappingJackson2HttpMessageConverter

请参考this帖子中给出的答案。

另一答案

如果只需要打印数据,则可以执行此操作

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(
    "your url",
    String.class);

System.out.println(response);

以上是关于使用Spring RestTemplate将嵌套的JSON对象映射到Java类的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestTemplate 反序列化嵌套对象

如何使用 spring 记录 RestTemplate 请求和响应?

Spring Cloud - 在 RestTemplate 中重试工作?

无法将 GWT 与 Spring RestTemplate 实现集成

如何使用 Spring RestTemplate 发布表单数据?

在 Spring 中使用 RestTemplate 作为请求参数的 MultipartFile + String