0

我有一个具有以下目的的 servlet:

通过 URL 接收数据(即使用 get)。然后根据这个输入返回一条消息,返回给调用者。我对这些东西很陌生,但已经了解到使用 json(实际上是 Gson)适合这个。

我现在的问题是,如何检索此 json 消息?我要定位哪个 URL?servlet 中的相关行是:

String json = new Gson().toJson(thelist);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().println(json);

这就是我尝试检索 json 的方式:

try{
            DefaultHttpClient defaultClient = new DefaultHttpClient();
            HttpGet httpGetRequest = new HttpGet("http://AnIPno:8181/sample/response?first=5&second=92866");
            HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
            BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
            String json = reader.readLine();
            JSONObject jsonObject = new JSONObject(json);

} catch(Exception e){
            e.printStackTrace();
        }

但显然这不起作用,因为我发现 jsonObject 的大小为 0(它应该是一个包含三个元素的数组)。

以前,我在 servlet 中有一个 write() 而不是 println()。我不确定这在这种情况下是否重要。但我假设我对如何检索 json 对象有误解。将其指向 servlet 的 URL 还不够吗?

4

2 回答 2

0

我有这个函数可以从请求中读取 JSON 数据到 JSON 字符串。您可以使用此函数检索 JSON,然后使用 GSON 将其解析为您喜欢的对象。它适用于我的应用程序。希望它也适合你。

    protected String readJson(HttpResponse resp)
        throws IOException {

        BufferedReader reader = null;  

        try {
            reader = new BufferedReader(new InputStreamReader(
                    resp.getEntity().getContent()));
            StringBuffer buffer = new StringBuffer();
            int read;
            char[] chars = new char[1024];
            while ((read = reader.read(chars)) != -1)
                buffer.append(chars, 0, read);
        } finally {
            if (reader != null)
                reader.close();
        }
        return buffer.toString();
    }

所以根据你的代码。我想这应该可行:

String jsonData = readJson(httpResponse);
YourObject obj = new Gson().fromJson(jsonData, YourObject.class);

在尝试之前,请确保您的 servlet 打印出您想要的 JSON 数据。我建议使用这些 Chrome 扩展:Postman - REST Client 和 JSON Formatter,来测试来自 servlet 的数据。这很有帮助。

于 2013-04-24T19:29:55.377 回答
0

InputStream在大多数情况下,从文件系统上的文件或 HTTP 请求中读取是相同的。

只有当您的 servlet 只写了一行时,您所拥有的才是正确的。如果Gson对象toString()方法返回多行,您将不得不从InputStream. 我喜欢使用Scanner该类从InputStream.

try {
    DefaultHttpClient defaultClient = new DefaultHttpClient();
    HttpGet httpGetRequest = new HttpGet("http://localhost:8080/cc/jsonyeah");
    HttpResponse httpResponse = defaultClient.execute(httpGetRequest);

    Scanner scanner = new Scanner(httpResponse.getEntity().getContent(), "UTF-8");       

    while(scanner.hasNextLine()) { // scanner looks ahead for an end-of-line
        json += scanner.nextLine() + "\n"; // read the full line, you can append a \n
    }               
    // do your serialization
} catch(Exception e) {
      e.printStackTrace();
}

因此,如果我们从文件中读取,我们会做同样的事情。现在该json对象包含您从 servlet 收到的 json,作为String.

对于序列化,您有几个选择。

一个Gson对象有一个重载的方法fromJson(),它可以采用 aString或 aReader等。

从我们在上面的代码中,你可以做

MyClass instance = new Gson().fromJson(json, MyClass.class);

MyClass您要创建的类型在哪里。您将不得不使用TypeToken通用类(例如列表)。TypeToken是一个抽象类,所以生成一个匿名类并调用getType()

Type type = new com.google.gson.reflect.TypeToken<List<String>>(){}.getType();
List<MyClass> list = new Gson().fromJson(json, type);

另一种选择是使用直接采用 Reader 的重载方法,而不是从 InputStream 中逐行读取:

BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
MyClass instance = new Gson().fromJson(reader , MyClass.class);

你会跳过一个步骤。

不要忘记关闭您的信息流。

于 2013-04-24T22:02:01.817 回答