restful webservice 获取对象列表

restful webservice get list of objects

我的rest webservice returns输出如下:

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

您提供的对象不包含 list/array,它应该在方括号内,如下所示:

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

如果可能,请将您的服务更改为 return list/array。否则,您拥有的是一个包含名为 TICKET1 和 TICKET2 的单独字段的对象,因此您需要为每个字段创建一个字段。

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

选项 1:

修改您的 TicketResponse class 如下:

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

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

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

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