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

13

我知道这可能很简单。但是,我就是无法让它工作。

所以,我正在尝试使用Spring RestTemplate来映射我的JSON数据。我有一个来自rest调用的以下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();
}

现在问题来了。我能够获取“message”和“status”,但是当我尝试记录/打印数据时,它显示为空值。不确定发生了什么。我确实需要帮助。谢谢。


2
我遇到了同样的问题,你找到解决方法了吗? - user2137817
你找到任何解决方案了吗?谢谢。 - Fco
8个回答

5
我曾经遇到过与RestTemplate不同的问题,它无法将嵌套的JSON对象映射到我的类模型中。在经历了很多挫折后,我决定使用RestTemplate将JSON作为字符串检索(而不是直接转换为目标对象),然后使用Google Gson库将字符串转换为目标实体。

pom.xml

<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进行映射时没有成功,但我希望这个解决方法有所帮助!


我移除了嵌套类并创建了另一个类。 - Kay

4

当我使用 Rest Template 从 REST API 读取 JSON 数据时,遇到了类似的问题。为了解决这个问题,请为列表声明 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将从列表数组中内部映射值到相应的数组。


2
我遇到了同样的问题。使用@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)。

1
使用@JsonUnwrapped注释以下内容中的“data”属性。
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {
    private String message;
    private String status;
    @JsonUnwrapped
    private List<Data> data;
}

1

我知道这是一个旧的线程。

但是对于任何遇到相同问题的人,您可以使用Jackson中的MappingJackson2HttpMessageConverter来解决此问题。

请参考this线程中给出的答案。


1

将此更改

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

到这样

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

这对我有用!


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

我没有放置setter和getter,以避免混乱。尝试初始化“data”。仍然返回null。同时,“Include.NON_EMPTY”编译错误,“Include无法解析为变量”?谢谢。 - Ren
请导入以下内容:import com.fasterxml.jackson.annotation.JsonInclude; - sayan

-1
如果您只需要打印数据,您可以这样做。
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity(
    "your url",
    String.class);

System.out.println(response);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接