从servlet获取json响应到Android

时间:2013-04-24 18:57:01

标签: android json servlets

我有一个具有以下用途的servlet:

通过URL接收数据(即使用get)。然后根据此输入将消息返回给调用者。我对这些东西不熟悉,但已经知道使用json(实际上是Gson)适合这个。

我现在的问题是,如何检索此json消息?我的目标是什么网址? 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是不够的?

2 个答案:

答案 0 :(得分:0)

我有这个函数来从一个请求读取JsonData到一个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扩展程序:邮递员 - REST客户端和JSON格式化程序,以测试来自servlet的数据。这非常有帮助。

答案 1 :(得分:0)

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

只有当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(),其中包含StringReader等。

从上面的代码我们可以做到

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);

你可以跳过一步。

不要忘记关闭你的溪流。