我有一个具有以下用途的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是不够的?
答案 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()
,其中包含String
或Reader
等。
从上面的代码我们可以做到
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);
你可以跳过一步。
不要忘记关闭你的溪流。