JSON 对象数组到 pojo

JSON object array to pojo

当我从 postman 调用 REST 服务 (GET) 时,它会检索结果。但是当尝试从代码中使用服务时,我没有按预期获得数据。我怀疑它与 JSON/POJO 映射有关。我尝试了不同的方式,但没有给出结果。这里可能有什么问题?

这是我尝试从邮递员

收到的json回复
[
  {
    "id": 20,
    "type": 2,
    "data": {
      "name": "car"
    }
  },
  {
   "id": 20,
   "type": 2,
   "data": {
    "name": "car"
    }
  }
]

这是我的 pojo:

class Market{
  public int id;
  public int type;
  public MarketData data;
}
class MarketData {
   public Strig name;

}

这是我使用服务的方式:

HttpClient client = HttpClients.custom().build();

 HttpUriRequest request = RequestBuilder.get()
         .setUri("url")
         .setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
         .setHeader(HttpHeaders.ACCEPT, "application/json")
         .build();

 HttpResponse response = client.execute(request);
 if (response.getStatusLine().getStatusCode() != 200) {
     throw new RuntimeException("Failed : HTTP error code : "
             + response.getStatusLine().getStatusCode());
 } 
 
 ObjectMapper mapper = new ObjectMapper();
 MarketData[] marketData = mapper.readValue(response.getEntity().getContent(), MarketData[].class);
 

正如 Nico 在评论中指出的,我认为您在 objectMapper.readValue() 行中有错字。它应该为 Market 而不是 MarketData 提供数组类型。我的意思是这一行:

MarketData[] marketData = mapper.readValue(response.getEntity().getContent(), MarketData[].class);

实际上应该是:

Market[] markets = objectMapper.readValue(response, Market[].class);

我这样测试这段代码:

File responseFile = new File(JsonObjectArrayToPojo.class.getResource("/response.json").getFile());
String response = new String(Files.readAllBytes(responseFile.toPath()));
ObjectMapper objectMapper = new ObjectMapper();
Market[] markets = objectMapper.readValue(response, Market[].class);

System.out.println("marketData length " + markets.length);
for (Market m :  markets) {
    System.out.printf("\tid: %s", m.id);
    System.out.printf("\ttype: %s", m.type);
    System.out.printf("\tdata name: %s", m.data.name);

    System.out.println();
}

我将此 response.json 添加到我的资源目录:

[{
    "id": 20, "type": 2, "data": { "name": "car"}
  },
  {
    "id": 10, "type": 1, "data": { "name": "Bike" }
  }]

这将打印以下输出:

marketData length 2
    id: 20  type: 2 data name: car
    id: 10  type: 1 data name: Bike