【问题标题】:Spring Boot RestTemplate ListSpring Boot Rest模板列表
【发布时间】:2020-05-02 05:19:30
【问题描述】:

我收到这样的回复:

{  
   "data":[  
      {  
         "object1":"example",
         "object2":"example",
         "object3":"example",
         "object4":"example",
         "object5":"example"
      },
      {  
         "object1":"example",
         "object2":"example",
         "object3":"example"
      }
   ]
}

现在我想将此数据映射到我的类 DTO,但我得到一个“错误”,因为 DTO 没有 data 字段。我希望它在我班级的List 或数组中。 喜欢:

List<MyClass> list = restTemplate.getForObject(url, MyClass.class);

希望你明白我的意思?

【问题讨论】:

  • 我认为您的响应 json 是错误的,因为在 data[0] 中的键是多重的,这是错误的。我们知道 json 应该有唯一的键。值可以相同。
  • 你只要把上面的json复制到json编辑器里,你就明白我的意思了
  • JSON 对象是有效的,我只是用“parma”编辑过,实际上还有其他对象
  • 我认为您需要获取 Map 并将所有键放入其中,然后将此映射放入 List
  • 您的 DTO 包含那些 object1object2、... 属性?

标签: java json spring


【解决方案1】:

想到的一种方法是将 JSON 响应转换为Map&lt;String, List&lt;MyClass&gt;&gt;,然后查询映射,即map.get("data"),以获取实际的List&lt;MyClass&gt;

为了将 JSON 响应转换为Map&lt;String, List&lt;MyClass&gt;&gt;,您需要定义一个类型引用

ParameterizedTypeReference<Map<String, List<MyClass>>> typeRef = 
                           new ParameterizedTypeReference<Map<String, List<MyClass>>>() {};

然后将 typeRef 传递给 exchange 方法,如下所示:

ResponseEntity<Map<String, List<MyClass>>> response = 
                                 restTemplate.exchange(url, HttpMethod.GET, null, typeRef);

最后:

System.out.println(response.getBody().get("data"));

如果您想知道为什么我们需要类型引用,请考虑阅读 Neal Gafter 在 Super Type Tokens 上的帖子。

更新:如果您要反序列化以下架构:

{
    "data": [],
    "paging": {}
}

最好创建一个像下面这样的哑容器类:

class JsonHolder {
    private List<MyClass> data;
    private Object paging; // You can use custom type too.

    // Getters and setters
}

然后在您的RestTemplate 调用中使用它:

JsonHolder response = restTemplate.getForObject(url, JsonHolder.class);
System.out.println(response.getData()); // prints a List<MyClass>
System.out.println(response.getPaging()); // prints an Object

【讨论】:

  • 谢谢,如何将其映射到变量 List
  • 我能想到任何只需要RestTemplate 参与的解决方案。我猜你应该直接使用 Jackson 并手动将 JSON 字符串反序列化为 List&lt;MyClass&gt;
  • 还有一个问题,当我在“数据”集之后有另一个结构时,我该如何处理?喜欢pastebin.com/mUUm6Tib
  • +1 用于使用 ParameterizedTypeReference - 我开始创建一个“MyClassList extends List”对象,然后将 MyClassList.class 作为返回类型,但这更简洁
【解决方案2】:

您可以使用 Spring 的 ResponseEntity 和 MyClass 数组。下面的代码将返回一个环绕的 MyClass 数组

例如

ResponseEntity<MyClass[]> response = restTemplate.exchange(
   url,
   HttpMethod.GET,
   request,
   MyClass[].class
);
... 
// response null check etc. goes here
...
MyClass[] myArr = response.getBody();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    相关资源
    最近更新 更多