如何从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上。

  • 如何使用PHP正确输出JSON数据
  • 如何从Android中的Json自动生成模型类
  • 从JSON填充Listview
  • Android Json和空值
  • 如何在Java中创建嵌套的Json对象?
  • replace标准的Android JSONparsing器以获得更好的性能?
  • Android中的JSONparsing
  • parsingAndroid Volley JSONArray响应
  • 有两件事情可以做得更有效率:

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