如何从Java HTTPResponse解析JSON?

时间:2010-05-16 21:39:43

标签: java android json

我有一个HttpResponse对象,用于我刚刚制作的网页请求。响应采用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上,如果这有任何区别。

7 个答案:

答案 0 :(得分:83)

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

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

  3. 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实际上是一行,那么您也可以删除循环和构建器。

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

答案 1 :(得分:9)

使用JSON Simple,

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

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

你可以这样做,

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

答案 2 :(得分: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);

}

这里是从服务器

获取的示例json文件
{
"id":5,
"name":"kitkat",
"version":"4.4"
}

这是我的班级

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

参考this

答案 3 :(得分:2)

Jackson似乎直接从InputStream支持一些JSON解析。我的理解是它在Android上运行并且相当快。另一方面,它是一个额外的JAR,包含在您的应用中,增加了下载和闪存大小。

答案 4 :(得分:0)

而不是做

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

答案 5 :(得分:0)

对于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

{{1}}

答案 6 :(得分:-3)

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

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