如何从Java HTTPResponse中parsingJSON?

我有一个HttpResponse对象,用于我刚刚创build的Web请求。 响应是JSON格式,所以我需要parsing它。 我可以用一个荒唐复杂的方式来做,但似乎必须有更好的办法。

这真的是我能做的最好的吗?

HttpResponse response; // some response object Reader in = new BufferedReader( new InputStreamReader(response.getEntity().getContent(), "UTF-8")); StringBuilder builder= new StringBuilder(); char[] buf = new char[1000]; int l = 0; while (l >= 0) { builder.append(buf, 0, l); l = in.read(buf); } JSONTokener tokener = new JSONTokener( builder.toString() ); JSONArray finalResult = new JSONArray( tokener ); 

如果这有什么不同,我在Android上。

有两件事情可以做得更有效率:

  1. 使用StringBuilder而不是StringBuffer因为它是更快和更年轻的兄弟。
  2. 使用BufferedReader#readLine()逐行读取它,而不是通过char读取它。

 HttpResponse response; // some response object BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); StringBuilder builder = new StringBuilder(); for (String line = null; (line = reader.readLine()) != null;) { builder.append(line).append("\n"); } JSONTokener tokener = new JSONTokener(builder.toString()); JSONArray finalResult = new JSONArray(tokener); 

如果JSON实际上是一行,那么你也可以删除循环和构build器。

 HttpResponse response; // some response object BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); String json = reader.readLine(); JSONTokener tokener = new JSONTokener(json); JSONArray finalResult = new JSONArray(tokener); 

使用JSON简单,

http://code.google.com/p/json-simple/

其中有一个小脚印,没有依赖,所以这是完美的Android。

你可以做这样的事情,

 Object obj=JSONValue.parse(buffer.tString()); JSONArray finalResult=(JSONArray)obj; 

您可以使用Gson库进行分析

 void getJson() throws IOException { HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("some url of json"); HttpResponse httpResponse = httpClient.execute(httpGet); String response = EntityUtils.toString(httpResponse.getEntity()); Gson gson = new Gson(); MyClass myClassObj = gson.fromJson(response, MyClass.class); } 

这里是从服务器提取的示例json文件

 { "id":5, "name":"kitkat", "version":"4.4" } 

这是我的class

 class MyClass{ int id; String name; String version; } 

参考这个

Jackson似乎支持直接从InputStreamparsing一定数量的JSON。 我的理解是它运行在Android上,速度相当快。 另一方面,它是一个额外的JAR包括与您的应用程序,增加下载和在Flash大小。

而不是做

 Reader in = new BufferedReader( new InputStreamReader(response.getEntity().getContent(), "UTF-8")); StringBuilder builder= new StringBuilder(); char[] buf = new char[1000]; int l = 0; while (l >= 0) { builder.append(buf, 0, l); l = in.read(buf); } JSONTokener tokener = new JSONTokener( builder.toString() ); 

你可以做:

 JSONTokener tokener = new JSONTokener( IOUtils.toString(response.getEntity().getContent()) ); 

IOUtils来自公共IO库。

对于Android,并使用Apache的Commons IO Library for IOUtils

 // connection is a HttpURLConnection InputStream inputStream = connection.getInputStream() ByteArrayOutputStream baos = new ByteArrayOutputStream(); IOUtils.copy(inputStream, baos); JSONObject jsonObject = new JSONObject(baos.toString()); // JSONObject is part of Android library 

你不需要自己做阅读器循环。 JsonTokener有这个内置的例如

 ttpResponse response; // some response object BufferedReader reader = new BufferedReader(new JSONTokener tokener = new JSONTokener(reader); JSONArray finalResult = new JSONArray(tokener);