如何从Java HTTPResponse解析JSON?

Joe*_*wig 71 java android json

我有一个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 );
Run Code Online (Sandbox Code Playgroud)

我在Android上,如果这有任何区别.

Bal*_*usC 83

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

  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);
Run Code Online (Sandbox Code Playgroud)

如果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);
Run Code Online (Sandbox Code Playgroud)

  • 内部的`BufferedReader`已经在8KB上缓冲.毕竟,这可能是微优化,无论哪种方式都足够好,我宁愿在上面提供更具可读性的代码.您正在使用的习惯用法是字节流的典型,而不是字符流.PS:为什么编辑问题用`StringBuilder`替换`StringBuffer`?现在我的建议对于第一次阅读这个问题的人来说没有多大意义:) (4认同)

ZZ *_*der 9

使用JSON Simple,

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

它有一个小的足迹,没有依赖性,所以它非常适合Android.

你可以这样做,

Object obj=JSONValue.parse(buffer.tString());
JSONArray finalResult=(JSONArray)obj;
Run Code Online (Sandbox Code Playgroud)


Raj*_*tth 5

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

}
Run Code Online (Sandbox Code Playgroud)

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

{
"id":5,
"name":"kitkat",
"version":"4.4"
}
Run Code Online (Sandbox Code Playgroud)

这是我的课

class MyClass{
int id;
String name;
String version;
}
Run Code Online (Sandbox Code Playgroud)

参考这个