从 RESTful Java 客户端获取 JSON
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11380421/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Getting JSON out put from restful java client
提问by Ruwantha
I'm developing a web service using REST (Jersey 1.8). Currently I'm using XML to communicate between the Java client and the server.
我正在使用 REST (Jersey 1.8) 开发 Web 服务。目前我使用 XML 在 Java 客户端和服务器之间进行通信。
I need to change it to JSON: how can I do that? I have bunch of auto generated code from NetBeans, and have no idea what to do and how. When the testing the service it shows the JSON data. What I'm unable to do is deal with it within my main
method.
我需要将其更改为 JSON:我该怎么做?我有一堆来自 NetBeans 的自动生成的代码,但不知道该做什么以及如何做。在测试服务时,它会显示 JSON 数据。我无法做的是在我的main
方法中处理它。
these are the tutorial I followed
这些是我遵循的教程
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RESTfulWebServices/RESTfulWebservices.htm
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RESTfulWebServices_Part2/RESTfulWebservicesPart2.htm
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RESTfulWebServices_Part3/RESTfulWebservicesPart3.htm
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RESTfulWebServices/RESTfulWebservices.htm
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RESTfulWebServices_Part2/RESTfulWebservicesPart2.htm
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RESTfulWebServices_Part3/RESTfulWebservicesPart3.htm
My Java client main
method:
我的 Java 客户端main
方法:
public class SOATestClient {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
PersonJerseyClient client = new PersonJerseyClient();
ClientResponse response = client.findAll_XML(ClientResponse.class);
GenericType<List<Person>> genericType = new GenericType<List<Person>>() {
};
// Returns an ArrayList of Players from the web service
List<Person> data = new ArrayList<Person>();
data = (response.getEntity(genericType));
System.out.println("Retreiving and Displaying Players Details");
for (Person person : data) {
System.out.println("FirstName: " + person.getName());
System.out.println("ID : " + person.getId());
System.out.println(" Age : " + person.getAge());
}
client.close();
}
}
personjerseycilent
个人
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package jerseyclients;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;
/**
* Jersey REST client generated for REST resource:PersonFacadeREST
* [entity.person]<br>
* USAGE:
* <pre>
* PersonJerseyClient client = new PersonJerseyClient();
* Object response = client.XXX(...);
* // do whatever with response
* client.close();
* </pre>
*
* @author rj45
*/
public class PersonJerseyClient {
private WebResource webResource;
private Client client;
private static final String BASE_URI = "http://localhost:8080/SOATestService/resources";
public PersonJerseyClient() {
com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
client = Client.create(config);
webResource = client.resource(BASE_URI).path("entity.person");
}
public void remove(String id) throws UniformInterfaceException {
webResource.path(java.text.MessageFormat.format("{0}", new Object[]{id})).delete();
}
public String countREST() throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path("count");
return resource.accept(javax.ws.rs.core.MediaType.TEXT_PLAIN).get(String.class);
}
public <T> T findAll_XML(Class<T> responseType) throws UniformInterfaceException {
WebResource resource = webResource;
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
}
public <T> T findAll_JSON(Class<T> responseType) throws UniformInterfaceException {
WebResource resource = webResource;
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
}
public void edit_XML(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_XML).put(requestEntity);
}
public void edit_JSON(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).put(requestEntity);
}
public void create_XML(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_XML).post(requestEntity);
}
public void create_JSON(Object requestEntity) throws UniformInterfaceException {
webResource.type(javax.ws.rs.core.MediaType.APPLICATION_JSON).post(requestEntity);
}
public <T> T findRange_XML(Class<T> responseType, String from, String to) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{from, to}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
}
public <T> T findRange_JSON(Class<T> responseType, String from, String to) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{from, to}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
}
public <T> T find_XML(Class<T> responseType, String id) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{id}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
}
public <T> T find_JSON(Class<T> responseType, String id) throws UniformInterfaceException {
WebResource resource = webResource;
resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{id}));
return resource.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
}
public void close() {
client.destroy();
}
}
I try to access it with the following, and deal it with same way as XML,
我尝试使用以下方法访问它,并以与 XML 相同的方式处理它,
ClientResponse response = client.findAll_JSON(ClientResponse.class);
but it gives me
但它给了我
Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 0; columnNumber: 0; unexpected element (uri:"", local:"id"). Expected elements are <{}person>]
at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.readFrom(AbstractListElementProvider.java:251)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:523)
at soatestclient.SOATestClient.main(SOATestClient.java:33)
Caused by: javax.xml.bind.UnmarshalException
I would be grateful to if you could help me on this matter. Thank you!
如果你能在这件事上帮助我,我将不胜感激。谢谢!
采纳答案by paulsm4
1) Whoever is generating this error, is clearly expecting XML input. Not JSON. You need to change that ASAP:
1) 产生此错误的人显然是在期待 XML 输入。不是 JSON。你需要尽快改变:
javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
com.sun.istack.internal.SAXParseException2;
<= javax.xml.bind and SAXParse are both XML-only: JSON not invited
2) The stuff in your screen shot (presumably Jersey?) is definitely OK.
2)屏幕截图中的内容(大概是泽西岛?)绝对没问题。
3) I haven't followed the whole tutorial, and you haven't given enough information to tell where you went astray.
3)我没有完全按照教程学习,你也没有提供足够的信息来说明你在哪里误入歧途。
SUGGESTION:
建议:
Just retrace your steps in the tutorial, and make sureyou're selecting "JSON" (notXML, and notSOAP) every step of the way.
只需回顾本教程中的步骤,并确保在每一步都选择“JSON”(不是XML,也不是SOAP)。
=========== ADDENDUM ===========
============ 附录==========
OK - Thanx for the update. Here's where we're at:
好的 - 感谢更新。这是我们所在的位置:
1) This is the problem:
1)这是问题:
Exception in thread "main" javax.ws.rs.WebApplicationException: javax.xml.bind.UnmarshalException
- with linked exception:
[com.sun.istack.internal.SAXParseException2; lineNumber: 0; columnNumber: 0; unexpected element (uri:"", local:"id"). Expected elements are <{}person>]
at com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.readFrom(AbstractListElementProvider.java:251)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553)
at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:523)
at soatestclient.SOATestClient.main(SOATestClient.java:33)
Caused by: javax.xml.bind.UnmarshalException
2) You said this stack traceback is coming from the client.
2)你说这个堆栈回溯来自客户端。
So your server is 100% OK - the ONLYthing you need to do is fix your client. Cool :)
所以你的服务器是 100% OK -你唯一需要做的就是修复你的客户端。凉爽的 :)
3) The traceback shows the client is expecting XML ... but getting JSON instead.
3) 回溯显示客户端期待 XML ......但得到 JSON。
So the ONLYthing you should need to fix is to tell your client "Hey: read JSON, not XML". Again - cool :)
因此,您唯一需要解决的问题就是告诉您的客户“嘿:阅读 JSON,而不是 XML”。再次 - 酷:)
4) How do you do that?
4)你是怎么做到的?
Well, for starters, you need to get rid of this line (if you haven't already):
好吧,对于初学者来说,你需要去掉这条线(如果你还没有的话):
// Bad, bad bad. Don't do this!|
ClientResponse response = client.findAll_XML(ClientResponse.class);
5) You might want to change other parts of your client code - I don't know.
5) 您可能想要更改客户端代码的其他部分 - 我不知道。
You might also want to change your client's configuration - I don't know that, either.
您可能还想更改客户端的配置 - 我也不知道。
6) Suggestion: look at this other tutorial - it might point you in the right direction:
6)建议:看看这个其他教程 - 它可能会指向正确的方向:
NOTE:
笔记:
WHATEVERyou need to do - it should be REALLYsimple! Please review the link, review your code and your test client configuration ... and post back what you find!
WHATEVER你需要做的-它应该是真的简单!请查看链接,查看您的代码和测试客户端配置……然后发回您的发现!
Thank you in advance...
先感谢您...
回答by steven
i resolved the same question. if your exception is : unexpected element (uri:"", local:"id").........
我解决了同样的问题。如果您的异常是:意外元素(uri:"", local:"id").........
don't forget add follow code:
不要忘记添加以下代码:
DefaultClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
Client client = Client.create(clientConfig);
then the code:
然后代码:
return resource.type(MediaType.APPLICATION_JSON_TYPE).get(new GenericType<List<MyClass>>(){});
will be ok.
会好的。
回答by user902997
http://smoothexample.com/webservices/apache_cxf_rest_web_services_client.html
http://smoothexample.com/webservices/apache_cxf_rest_web_services_client.html
The above example gives sample client application using apache cxf, here client can consume both xml and json by providing the "Accept" header.
上面的示例给出了使用 apache cxf 的示例客户端应用程序,这里客户端可以通过提供“Accept”标头来使用 xml 和 json。
Also a simple example for cxf rest web service is also available here, which even returns both xml and json based on the "Accept" header.
还有一个简单的 cxf rest web 服务示例也可以在这里找到,它甚至根据“Accept”标头返回 xml 和 json。