Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SpringRESTTemplate将嵌套的JSON对象映射到Java类_Java_Json_Spring_Resttemplate - Fatal编程技术网

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

使用SpringRESTTemplate将嵌套的JSON对象映射到Java类,java,json,spring,resttemplate,Java,Json,Spring,Resttemplate,我知道这可能很简单。然而,我就是不能让它工作 所以我尝试使用SpringRestTemplate来映射我的JSON数据。我有一个rest调用的JSON响应 { "message":"ok", "status":"ok", "data":[ {"Name":"Yo", "Address":"100 Test Rd"}, {...}, {...} ] } 这是我试图将其映射到的类 @JsonIgnoreProperties(ign

我知道这可能很简单。然而,我就是不能让它工作

所以我尝试使用SpringRestTemplate来映射我的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;
}
以下是我用来调用RestTemplate的代码:

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

    return responseEntity.getBody();
}
 ResponseEntity<String> responseEntity = restTemplate.getForEntity(Url,String.class);
Gson gson = new GsonBuilder().create();
Response reponse = gson.fromJson(responseEntity , Response.class);
public response getResponse(){
ResponseEntity ResponseEntity=restTemplate.getForEntity(Url,response.class);
返回responseEntity.getBody();
}

现在问题来了。我能够获取“消息”和“状态”,但当我尝试记录/打印数据时,它显示为空。不太清楚这里发生了什么。我真的需要一些帮助。谢谢。

请使用
private List data=new AllarList()
; 请在这两个类中提供getter()和setters()方法

@JsonInclude(Include.NON_EMPTY)
放在数据类上方

请在主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>

com.fasterxml.jackson.core
杰克逊注释
2.2.3
com.fasterxml.jackson.core
杰克逊数据绑定
2.2.3
com.fasterxml.jackson.datatype
jackson数据类型joda
2.1.1
org.codehaus.jackson
杰克逊地图绘制者
1.8.8

如果您只需要打印数据,您可以这样做

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

System.out.println(response);
RestTemplate RestTemplate=new RestTemplate();
ResponseEntity response=restemplate.getForEntity(
“您的url”,
字符串(类);
System.out.println(响应);

我也遇到了类似的问题,RestTemplate没有将嵌套的JSON对象映射到我的类模型,在经历了很多挫折之后,我决定使用RestTemplate将JSON作为字符串检索(而不是直接转换为目标对象),然后使用google Gson库将字符串转换为目标实体

pom.xml

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

com.google.code.gson
格森
2.2.4
调用RestTemplate的代码:

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

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

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

在使用REST模板从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. 


}
@JsonIgnoreProperties(ignoreUnknown=true)
公共类响应实现可序列化{
私有字符串消息;
私有字符串状态;
私人名单数据;
//列表的getter和setter。
}
RestTemplate将在内部将值从listarray映射到相应的数组。

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

@JsonIgnoreProperties(ignoreUnknown = true)
public class Response implements Serializable {
    private String message;
    private String status;
    @JsonUnwrapped
    private List<Data> data;
}
@JsonIgnoreProperties(ignoreUnknown=true)
公共类响应实现可序列化{
私有字符串消息;
私有字符串状态;
@JsonUnwrapped
私人名单数据;
}

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

}

现在应该填充
数据
类的字段,您可以独立于JSON表示来命名字段(例如
名称
,而不是
名称
)。

我知道这是一个旧线程

但是,对于有相同问题的任何人,您都可以在Jackson中使用
MappingJackson2HttpMessageConverter


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

我没有在这里设置setter和getter以避免混乱。试图初始化“数据”。仍然返回null。“Include.NON_EMPTY”“Include无法解析为变量”上的编译错误?谢谢。请导入:导入com.fasterxml.jackson.annotation.JsonInclude;我也有同样的问题你找到解决办法了吗?你找到解决办法了吗?谢谢。我删除了嵌套类并创建了另一个类