简体   繁体   English

从宁静的Java客户端获取JSON

[英]Getting JSON out put from restful java client

I'm developing a web service using REST (Jersey 1.8). 我正在使用REST(Jersey 1.8)开发Web服务。 Currently I'm using XML to communicate between the Java client and the server. 目前我正在使用XML在Java客户端和服务器之间进行通信。

I need to change it to JSON: how can I do that? 我需要将其更改为JSON:我该怎么做? I have bunch of auto generated code from NetBeans, and have no idea what to do and how. 我有大量来自NetBeans的自动生成代码,并且不知道该做什么以及如何做。 When the testing the service it shows the JSON data. 在测试服务时,它显示JSON数据。 What I'm unable to do is deal with it within my main method. 我无法做的是在我的main方法中处理它。 在此输入图像描述

these are the tutorial I followed 这些是我遵循的教程

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 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! 谢谢!

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. 会好的。

1) Whoever is generating this error, is clearly expecting XML input. 1)产生此错误的人显然期望XML输入。 Not JSON. 不是JSON。 You need to change that ASAP: 你需要尽快改变:

 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 sure you're selecting "JSON" ( not XML, and not SOAP) every step of the way. 只需回顾教程中的步骤,并确保在每一步都选择“JSON”( 不是 XML,而不是 SOAP)。

=========== ADDENDUM =========== =========== ADDENDUM ===========

OK - Thanx for the update. 好的 - 用于更新的Thanx。 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 ONLY thing you need to do is fix your client. 所以你的服务器是100%好的 - 你唯一需要做的就是修复你的客户端。 Cool :) 酷:)

3) The traceback shows the client is expecting XML ... but getting JSON instead. 3)回溯显示客户端期待XML ...但是获取JSON。

So the ONLY thing you should need to fix is to tell your client "Hey: read JSON, not XML". 因此,您需要解决的唯一问题是告诉您的客户“嘿:读取JSON,而不是XML”。 Again - cool :) 再次 - 很酷:)

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: 注意:

WHATEVER you need to do - it should be REALLY simple! 无论你需要做的-它应该是简单的! Please review the link, review your code and your test client configuration ... and post back what you find! 请查看链接,查看您的代码和测试客户端配置...并回发您找到的内容!

Thank you in advance... 先感谢您...

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。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Java中的json客户端提供Restful服务 - json client in java for Restful service 如何通过Java中的RESTful客户端将JSON对象传递到服务器 - How to pass JSON object to server from RESTful client in java 在JAVA Restful API中从Couchbase DB获取JSON数据时出错 - Error on getting JSON data from Couchbase DB in JAVA Restful API RESTful Java 客户端将 JSON 响应转换为对象 - RESTful Java client convert JSON responses to Objects 基于Java的SSL CLIENT演练,内容涉及从Restful服务中提取JSON对象 - Java based SSL CLIENT walk-through, that covers pulling a JSON object from a Restful service 如何使用Java中的RESTful客户端将JSON格式的数据传递到服务器。这适用于Activity中的POST方法 - How to pass JSON format Data to server from RESTful client in java.This is for POST method in Activity 简单的休息JSON POST,java作为服务器,jquery作为客户端 - Simple restful JSON POST with java as server and jquery as client RESTful Java客户端和HttpClient - RESTful java Client and HttpClient 如何创建一个JSON文件以使用Java从数据库中提取数据? - How to create a JSON file getting out data with Java from database? 如何从 RESTful 服务器获取 JSON 内容到 Android 客户端? - How to get JSON content from a RESTful server to a Android client?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM