如何从 JavaHTTPResponse 解析 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 );

我用的是安卓系统,如果这有什么区别的话。

109169 次浏览

使用 JSON 简单,

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

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

你可以这么做,

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

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

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

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

Jackson 似乎直接支持来自 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 的 共用输入输出 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

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

请参阅 这个