如何从Java HTTPResponse中parsingJSON?
我有一个HttpResponse对象,用于我刚刚创build的Web请求。 响应是JSON格式,所以我需要parsing它。 我可以用一个荒唐复杂的方式来做,但似乎必须有更好的办法。
这真的是我能做的最好的吗?
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上。
有两件事情可以做得更有效率:
- 使用
StringBuilder
而不是StringBuffer
因为它是更快和更年轻的兄弟。 - 使用
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实际上是一行,那么你也可以删除循环和构build器。
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);
使用JSON简单,
http://code.google.com/p/json-simple/
其中有一个小脚印,没有依赖,所以这是完美的Android。
你可以做这样的事情,
Object obj=JSONValue.parse(buffer.tString()); JSONArray finalResult=(JSONArray)obj;
您可以使用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
class MyClass{ int id; String name; String version; }
参考这个
Jackson似乎支持直接从InputStream
parsing一定数量的JSON。 我的理解是它运行在Android上,速度相当快。 另一方面,它是一个额外的JAR包括与您的应用程序,增加下载和在Flash大小。
而不是做
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库。
对于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
你不需要自己做阅读器循环。 JsonTokener有这个内置的例如
ttpResponse response; // some response object BufferedReader reader = new BufferedReader(new JSONTokener tokener = new JSONTokener(reader); JSONArray finalResult = new JSONArray(tokener);