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());
}
}
我的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());
}
}