将JSON响应解析为对象

晚上好,
我是Web服务的新手,我只想编写一个简单的客户端,只需从REST调用中获取响应。
我下载并将jersey-bundle-1.17.1.jar添加到我的构建路径中,我找到了一段代码, jersey-bundle-1.17.1.jar一个url进行REST调用,并以String返回一个响应。

 import javax.ws.rs.core.MediaType; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; public class TestJerseyClient { public static void main(String[] args) { try { Client client = Client.create(); WebResource webResource = client .resource("http://path/to/service"); ClientResponse response = webResource .accept(MediaType.APPLICATION_JSON) .get(ClientResponse.class); if (response.getStatus() != 200) throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); String output = response.getEntity(String.class); System.out.println("Output from Server .... \n"); System.out.println(output); } catch (Exception e) { e.printStackTrace(); } } } 

但我不想做字符串操作来获取我感兴趣的响应部分。

我更喜欢更结构化的方法,比如获取Object而不是字符串
(一个JSON对象,一个Map Object等…)


尝试#1 – Map

 Sep 15, 2013 2:46:13 AM com.sun.jersey.api.client.ClientResponse getEntity SEVERE: A message body reader for Java class java.util.Map, and Java type java.util.Map, and MIME media type application/json; charset=UTF-8 was not found Sep 15, 2013 2:46:13 AM com.sun.jersey.api.client.ClientResponse getEntity SEVERE: The registered message body readers compatible with the MIME media type are: application/json; charset=UTF-8 -> com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App */* -> com.sun.jersey.core.impl.provider.entity.FormProvider com.sun.jersey.core.impl.provider.entity.StringProvider com.sun.jersey.core.impl.provider.entity.ByteArrayProvider com.sun.jersey.core.impl.provider.entity.FileProvider com.sun.jersey.core.impl.provider.entity.InputStreamProvider com.sun.jersey.core.impl.provider.entity.DataSourceProvider com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General com.sun.jersey.core.impl.provider.entity.ReaderProvider com.sun.jersey.core.impl.provider.entity.DocumentProvider com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General com.sun.jersey.core.impl.provider.entity.EntityHolderReader com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class java.util.Map, and Java type java.util.Map, and MIME media type application/json; charset=UTF-8 was not found at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:561) at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:535) at com.sun.jersey.api.client.WebResource.handle(WebResource.java:696) at com.sun.jersey.api.client.WebResource.access$300(WebResource.java:74) at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:512) at rest.TestJerseyClientAdvanced.main(TestJerseyClientAdvanced.java:36) 

我建议您使用Jackson进行(联合国)编组JSON响应。 这可以通过以下两个步骤完成。

步骤1。 创建一个java bean,其成员/对象名称与预期的响应匹配。 例如,MyResponse.class

第2步。 从客户端响应中读取实体时使用java bean。

 private static ClientConfig clientConfig = new DefaultClientConfig(); clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); ClientResponse response = Client.create(clientConfig). resource(uri).accept(MediaType.APPLICATION_JSON). header("content-type", MediaType.APPLICATION_JSON). get(MY_RESPONSE.class); MyResponse output = response.getEntity(MyResponse.class); 

您可以使用Genson库。

 // register genson in jersey client ClientConfig cfg = new DefaultClientConfig(GensonJsonConverter.class); Client client = Client.create(cfg); WebResource webResource = client.resource("http://path/to/service"); // you can map it to a pojo, no need to have a string or map SomePojo pojo = webResource .accept(MediaType.APPLICATION_JSON) .get(SomePojo.class); 

如果您只需要从大型JSON响应中获取少量属性,则可以使用Jersey客户端和JsonArray或JsonObject实体。

 String url = "http://api.goeuro.com/api/v2/position/suggest/en/"; String city = "New York"; Client client = ClientBuilder.newClient(); WebTarget webTarget = client.register(JsonProcessingFeature.class).target(url); JsonArray jsonArray = webTarget.path(city) .request(MediaType.APPLICATION_JSON_TYPE).get(JsonArray.class); for (JsonObject jsonObject : jsonArray.getValuesAs(JsonObject.class)) { JsonObject geoPosition = jsonObject.getJsonObject("geo_position"); System.out.println(Arrays.asList( jsonObject.getString("name"), jsonObject.getString("type"), geoPosition.get("latitude"), geoPosition.get("longitude"))); } 

Maven依赖

  org.glassfish.jersey.core jersey-client 2.22.1   org.glassfish.jersey.media jersey-media-json-processing 2.22.1  

看到这个例子…点击此链接获取更多信息

 // The request also includes the userip parameter which provides the end // user's IP address. Doing so will help distinguish this legitimate // server-side traffic from traffic which doesn't come from an end-user. URL url = new URL( "https://www.websitelink.com//folderresponsedata + "q=Paris%20Hilton&userip=USERS-IP-ADDRESS"); URLConnection connection = url.openConnection(); connection.addRequestProperty("Referer", /* Enter the URL of your site here */); String line; StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); while((line = reader.readLine()) != null) { builder.append(line); } JSONObject json = new JSONObject(builder.toString()); // now have some fun with the results... 

就那么简单 :

  ObjectMapper mapper = new ObjectMapper(); String json = "json value"; MyClass obj = mapper.readValue(json , MyClass .class);