宁静的Web服务获取对象列表

时间:2019-11-27 16:51:43

标签: spring spring-boot resttemplate

我的其余Web服务返回以下输出:

    {
    "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为空。怎么做。

3 个答案:

答案 0 :(得分:0)

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

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

如果可能,请更改服务以返回列表/数组。否则,您将拥有一个对象,其中包含名为TICKET1和TICKET2的各个字段,因此每个字段都需要一个字段。

答案 1 :(得分:0)

我将提供两种方法来处理您拥有的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<Ticket>

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());

答案 2 :(得分:0)

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

public class TicketResponse {
    private Map<String,Ticket> result;
    // getter setter

    public List<Ticket> getTicketsAsArray(){
        return new ArrayList<Ticket>(result.values());
    }
}