android - 如何解析Java HTTPResponse中的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 );
我在Android上,如果这有任何区别。
7个解决方案
83 votes
可以更有效地完成两件事:
使用StringBuilder而不是BufferedReader#readLine(),因为它是更快更年轻的兄弟。
使用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);
如果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);
BalusC answered 2019-06-07T07:18:51Z
9 votes
使用JSON Simple,
[http://code.google.com/p/json-simple/]
它有一个小的足迹,没有依赖性,所以它非常适合Android。
你可以这样做,
Object obj=JSONValue.parse(buffer.tString());
JSONArray finalResult=(JSONArray)obj;
ZZ Coder answered 2019-06-07T07:19:37Z
5 votes
您可以使用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;
}
参考这个
Rajesh Batth answered 2019-06-07T07:20:23Z
2 votes
杰克逊似乎直接从InputStream支持一些JSON解析。我的理解是它在Android上运行并且相当快。 另一方面,它是一个额外的JAR包含在您的应用程序中,增加了下载和闪存大小。
CommonsWare answered 2019-06-07T07:20:49Z
0 votes
而不是做
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库。
Jove Kuang answered 2019-06-07T07:21:19Z
0 votes
对于Android,使用Apache的Commons IO 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
Jonathan Lin answered 2019-06-07T07:21:45Z
-3 votes
没有必要自己做读者循环。 JsonTokener内置了这个功能。
ttpResponse response; // some response object
BufferedReader reader = new BufferedReader(new
JSONTokener tokener = new JSONTokener(reader);
JSONArray finalResult = new JSONArray(tokener);
guido answered 2019-06-07T07:22:11Z