将JSON响应解析为对象 [英] Parse a JSON response as an object
问题描述
晚上好,
我是网络服务的新手,我只想编写一个简单的客户端,只需从REST调用中获取响应。
我下载并添加 jersey-bundle-1.17.1.jar
到我的构建路径,我发现了一段代码,它对一个url进行REST调用,并以<$ c $的形式返回一个响应C>字符串。
Good evening,
I am a newbie in web services and i just want to write a simple client that simply gets responses from REST calls.
I downloaded and added jersey-bundle-1.17.1.jar
to my build path and i found a working piece of code that makes a REST call to a url and returns a response as a 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();
}
}
}
但我不想要做字符串操作以获得我感兴趣的响应部分。
But i don't want to do string manipulations to get the parts of the response that im interested in.
我更喜欢更结构化的方法,比如获取对象
而不是字符串
( JSON
对象,地图< K,V>
对象等...)
I would prefer a more structured approach, like getting an Object
instead of a string
(a JSON
Object, a Map<K,V>
Object, etc...)
尝试#1 -
地图< K,V>
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<java.lang.String, java.lang.Object>, 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<java.lang.String, java.lang.Object>, 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(un )编组JSON响应。这可以通过以下两个步骤完成。
I recommend you use Jackson for (un)marshalling JSON responses. This can be done is two steps as below.
Step1。创建一个java bean,其成员/对象名称与预期的响应匹配。例如,MyResponse.class
Step1. create a java bean with member/object names that match the expected response. e.g, MyResponse.class
Step2。从客户端响应中读取实体时使用java bean。
Step2. use the java bean when reading the entity from the client response.
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);
这篇关于将JSON响应解析为对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!