How to parse JSON from Java HTTPResponse?

I have an HttpResponse object for a web request just made. The answer is in JSON format, so I need to parse it. I can do this in an absurdly complicated way, but it seems like there should be a better way.

Is this really the best I can do?

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

I'm on Android if that matters.

+69
java json android
May 16 '10 at 21:39
source share
7 answers

Two things that can be done more efficiently:




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

If JSON is actually a single line, you can also remove the loop and the builder.

 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); 
+82
May 16 '10 at 21:44
source

Use JSON Simple,

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

Which has a small fingerprint, no dependencies, so it is perfect for Android.

You can do something like this,

 Object obj=JSONValue.parse(buffer.tString()); JSONArray finalResult=(JSONArray)obj; 
+8
May 16 '10 at 21:44
source

You can use the Gson library to parse

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

Here is an example json file that is fetchd from server

 { "id":5, "name":"kitkat", "version":"4.4" } 

here is my class

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

send this

+3
Nov 18 '13 at 14:35
source

Jackson seems to support some JSON parsing right from the InputStream . I understand that it works on Android and is pretty fast. On the other hand, this is an additional JAR, which can be included in the application, increasing the download size on the flash memory.

+1
May 16 '10 at 21:56
source

Instead of doing

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

You can do:

 JSONTokener tokener = new JSONTokener( IOUtils.toString(response.getEntity().getContent()) ); 

where IOUtils is from the IO shared library.

0
Apr 21 '13 at 23:35
source

For Android and using 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 
0
Jul 19 '13 at 9:20
source

There is no need to do the reader loop yourself. JsonTokener has this built-in device. For example,

 ttpResponse response; // some response object BufferedReader reader = new BufferedReader(new JSONTokener tokener = new JSONTokener(reader); JSONArray finalResult = new JSONArray(tokener); 
-3
Dec 28 '11 at 12:57
source



All Articles