1

我曾经使用Jersey 1.16JSON,但现在我很难使用 Jersey 2.0(实现 JAX-RS 2.0)来使用 JSON。

我有这样的 JSON 响应:

{
    "id": 105430,
    "version": 0,
    "cpf": "55443946447",
    "email": "maria@teste.br",
    "name": "Maria",
}

以及使用它的方法:

public static JSONObject get() {
   String url = "http://127.0.0.1:8080/core/api/person";
   URI uri = URI.create(url);

   final Client client = ClientBuilder.newClient();
   WebTarget webTarget = client.target(uri);            

   Response response = webTarget.request(MediaType.APPLICATION_JSON).get();

   if (response.getStatus() == 200) {      
      return response.readEntity(JSONObject.class);
   }
}

我也试过:

return webTarget.request(MediaType.APPLICATION_JSON).get(JSONObject.class);

但是jSONObject 返回的是 null。我不明白我的错误,因为响应正常!

4

3 回答 3

3

这是正确使用响应类型的方法:

  private void getRequest() {
    Client client = ClientBuilder.newClient();

    String url = "http://localhost:8080/api/masterdataattributes";
    WebTarget target = client.target(url);

    Response res = target
        .request(MediaType.APPLICATION_JSON)
        .get();

    int status = res.getStatus();
    String json = res.readEntity(String.class);

    System.out.println(String.format("Status: %d, JSON Payload: %s", status, json));
  }

如果您只对有效负载感兴趣,您也可以发出一个 get(String.class)。但通常您还想检查响应状态,因此使用响应通常是要走的路。

如果您想要一个类型化的(通用)JSON 响应,您还可以让 readEntity 返回一个 Map,或者如果响应是一个对象数组,则返回一个 Map 列表,如下例所示:

List<Map<String, Object>> json = res.readEntity(new GenericType<List<Map<String, Object>>>() {});
String id = (String) json.get(0).get("id");
System.out.println(id);
于 2019-05-02T11:02:40.053 回答
2

我找到了解决方案。也许它不是最好的,但它确实有效。

public static JsonObject get() {
  String url = "http://127.0.0.1:8080/core/api/person";
  URI uri = URI.create(url);

  final Client client = ClientBuilder.newClient();
  WebTarget webTarget = client.target(uri);

  Response response = webTarget.request(MediaType.APPLICATION_JSON).get();

  //Se Response.Status.OK;
  if (response.getStatus() == 200) {
     StringReader stringReader = new StringReader(webTarget.request(MediaType.APPLICATION_JSON).get(String.class));
     try (JsonReader jsonReader = Json.createReader(stringReader)) {
        return jsonReader.readObject();
     }
  }

  return null;

}

我通过 JsonObject(包 javax.json)切换了类 JSONObject(包导入 org.codehaus.jettison),并使用这些方法将内容作为字符串进行操作。

S。

于 2013-07-18T17:46:45.260 回答
1

mmey答案是正确和最佳的答案,而不是调用服务两次,而是调用一次。

于 2019-05-12T00:27:06.127 回答