如何从Java HTTPResponse解析JSON?

如何从Java HTTPResponse解析JSON?,java,android,json,Java,Android,Json,我有一个HttpResponse对象,用于我刚刚发出的web请求。响应是JSON格式的,所以我需要解析它。我可以用一种荒谬而复杂的方式来做,但似乎一定有更好的方式 这真的是我能做的最好的了吗 HttpResponse response; // some response object Reader in = new BufferedReader( new InputStreamReader(response.getEntity().getContent(), "U

我有一个HttpResponse对象,用于我刚刚发出的web请求。响应是JSON格式的,所以我需要解析它。我可以用一种荒谬而复杂的方式来做,但似乎一定有更好的方式

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

    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。

使用JSON Simple

它的脚印很小,没有依赖性,所以非常适合Android

你可以这样做

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

可以更有效地完成两件事:

  • 使用而不是,因为它是更快和更年轻的兄弟
  • 用于逐行读取,而不是逐字符读取

  • 如果JSON实际上是一行,那么还可以删除循环和生成器

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

    似乎直接从
    InputStream
    支持一些JSON解析。我的理解是,它运行在Android上,速度相当快。另一方面,它是一个额外的JAR,可以随应用程序一起使用,增加下载量和闪存大小。

    无需自己进行读卡器循环。JsonTokener内置了这一功能。例如

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

    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来自commons IO库。

    用于Android,使用Apache库用于
    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
    

    您可以使用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 MyClass{
    int id;
    String name;
    String version;
    }
    

    请参阅

    问题中的代码是否会从流中一次读取1000字节?显然,这取决于输出的平均行大小,但这很可能比每行一个批少。不,正如方法名称已经提示的那样,
    BufferedReader#readLine()
    逐行读取流。也就是说,它在换行符上拆分流。尝试一下,亲身体验一下。这是我的观点。如果一行平均少于1000个字符,那么使用BufferedReader#readLine()将比BufferedReader#read()占用更多的循环时间。(除非输出有很多短线,否则差异可能无关紧要。)
    BufferedReader
    内部已经在8KB上进行缓冲。毕竟,这很可能是微优化,无论哪种方法都足够好,我更喜欢可读性更强的代码。您所使用的习惯用法通常用于字节流,而不是字符流。PS:您为什么编辑该问题以将
    StringBuffer
    替换为
    StringBuilder
    ?现在我的建议对于那些第一次阅读这个问题的人来说没有什么意义:)我只是更改了变量名。在问题的原始版本中,它是一个StringBuilder,但我可以看出使用名称“buffer”可能会混淆一些事情与内置的
    org.json
    包相比,它有什么优势?如果您熟悉org.json,并且您的应用程序仅适用于Android,那么它可能没有优势。否则,jsonsimple的使用就简单多了,JAR也小得多(14k对43k)。我们在任何地方都使用它,甚至在Android上也是如此。我找不到任何接受BufferedReader的JSONTokener构造函数,因此这个答案是误导性的。没有接受BufferedReader的构造函数,但Reader和BufferedReader是Reader的子类。-->json.JSONTokener(Reader Reader)这个构造器似乎不是Android的一部分:我从json.org网站上得到了我的构造器,它似乎与Android版本不同。
    class MyClass{
    int id;
    String name;
    String version;
    }