【问题标题】:restful webservice get list of objectsrestful webservice 获取对象列表
【发布时间】:2020-03-23 07:01:12
【问题描述】:

我的 rest webservice 返回以下输出:

    {
    "result": {
       "TICKET1": {
            "number": "TICKET1",
            "description": "aa"
        },
        "TICKET2": {
            "number": "TICKET2",
            "description": "dd"
        }
     }
    }

要将其转换为我尝试如下的门票列表。

class TicketResponse {
     private List<Ticket> result;
     // Get Set
}

class Ticket {
     private String number;
     private String description;
     // Get Set
}

TicketResponse response = restTemplate.getForObject(WEB_SERVICE_URL, TicketResponse.class);

但我得到response 为空。如何做到这一点。

【问题讨论】:

    标签: spring spring-boot resttemplate


    【解决方案1】:

    您提供的对象不包含列表/数组,它会在方括号内,如下所示:

    {
      "result": {
        "tickets": [
          {
            "number": "TICKET1",
            "description": "aa"
          },
          {
            "number": "TICKET2",
            "description": "dd"
          }
        ]
      }
    }
    

    尽可能更改您的服务以返回列表/数组。否则,您将拥有一个具有名为 TICKET1 和 TICKET2 的单独字段的对象,因此您需要为每个字段提供一个字段。

    【讨论】:

      【解决方案2】:

      我将提供两种方法来处理您拥有的 JSON 结构。

      选项 1:

      修改您的TicketResponse 类,如下所示:

      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
      import java.util.Map.Entry;
      import java.util.stream.Collectors;
      
      import com.fasterxml.jackson.annotation.JsonAnySetter;
      import com.fasterxml.jackson.annotation.JsonIgnore;
      import com.fasterxml.jackson.annotation.JsonProperty;
      
      public class TicketResponse {
      
        @JsonProperty("result")
        private Map<String, Ticket> ticketsMap = new HashMap<>();
      
        @JsonAnySetter
        public void setUnknownField(String name, Ticket value) {
          ticketsMap.put(name, value);
        }
      
        @JsonIgnore private List<Ticket> ticketsList;
      
        public List<Ticket> getTicketsList() {
          return ticketsMap.entrySet().stream().map(Entry::getValue).collect(Collectors.toList());
        }
      }
      

      然后您可以从以下位置获取您的门票清单:

      response.getTicketsList();
      

      选项 2:

      阅读您对String的回复

      String response = restTemplate.getForObject(WEB_SERVICE_URL, String.class);
      

      并使用下面的代码将其转换为List&lt;Ticket&gt;

      ObjectMapper mapper = new ObjectMapper();
      JsonNode jsonNode = mapper.readTree(response);
      JsonNode wantedJsonNode = jsonNode.get("result");
      Map<String, Ticket> map =
              mapper.convertValue(wantedJsonNode, new TypeReference<Map<String, Ticket>>() {});
      List<Ticket> tickets =
              map.entrySet().stream().map(Entry::getValue).collect(Collectors.toList());
      

      【讨论】:

      • 需要setUnknownField方法吗?
      • 是的,这是必需的。它填充映射,@JsonAnySetter 用于定义两个参数方法(键、值)来填充 JSON 中无法识别的属性。在您的情况下,非静态键是 TICKET1、TICKET2 等,值映射到 Ticket 对象。
      【解决方案3】:

      TicketResponse 必须具有与服务响应相对应的结构。 您可以更改您的 TicketResponse 类并添加 getTicketArray 方法:

      public class TicketResponse {
          private Map<String,Ticket> result;
          // getter setter
      
          public List<Ticket> getTicketsAsArray(){
              return new ArrayList<Ticket>(result.values());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-21
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多