代码之家  ›  专栏  ›  技术社区  ›  Joe Ludwig

如何从Java HTTPResponse解析JSON?

  •  71
  • Joe Ludwig  · 技术社区  · 16 年前

    我有一个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 );
    

    7 回复  |  直到 16 年前
        1
  •  83
  •   BalusC    16 年前

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

    1. StringBuilder 而不是 StringBuffer 因为它是更快更年轻的弟弟。
    2. BufferedReader#readLine() 逐行读而不是逐字读。

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

    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);
    
        2
  •  9
  •   ZZ Coder    16 年前

    使用JSON Simple,

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

    你可以这样做,

    Object obj=JSONValue.parse(buffer.tString());
    JSONArray finalResult=(JSONArray)obj;
    
        3
  •  5
  •   Rajesh Batth    12 年前

    您可以使用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;
    }
    

    参考 this

        4
  •  2
  •   CommonsWare    16 年前

    Jackson InputStream . 我的理解是,它运行在Android上,速度相当快。另一方面,它是一个额外的JAR来包含在你的应用程序中,增加下载量和flash大小。

        5
  •  0
  •   Jove Kuang    13 年前

    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库。

        6
  •  0
  •   Jonathan Lin    13 年前

    对于Android,使用Apache的 Commons IO 图书馆 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
    
        7
  •  -3
  •   guido    14 年前

    没有必要自己做读卡器循环。JsonTokener内置了这个。例如。

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