33
HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://my.server:8080/android/service.php"); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); nameValuePairs.add(new BasicNameValuePair("action", "getjson")); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); 

service.php generates a json string. How would i fetch it from my response? Btw; I've icluded the GSON library, can i make use of any methods in it perhaps?

Solutions similar to this one looks pretty ugly, imo: best way to handle json from httpresponse android

There much be better ways, right?

Any help is appreciated, thanks


Update:

String json = EntityUtils.toString(response.getEntity()); 

seems to do the trick. There is just one small issue: The string is wrapped with brackets []. Should i remove them manually? They are generated by php:s json_encode()

4
  • 1
    Brackets denote a JSON array. You should process the response as such. Commented Jun 20, 2012 at 23:03
  • @Perception Correct. I removed my container array from the php code, and its solved the issue. Thanks Commented Jun 20, 2012 at 23:07
  • @Johan Could you post your answer and accept it so others may find it useful and know what exactly resolved the issue. Thanks! Commented Jun 20, 2012 at 23:14
  • @SagarHatekar Will do, cant accept it in a while though. Commented Jun 20, 2012 at 23:15

4 Answers 4

27

I think the problem you are running into is one similar to my own I just ran into. If you run:

 String json_string = EntityUtils.toString(response.getEntity()); JSONObject temp1 = new JSONObject(json_string); 

The above code will throw an exception and it looks like the JSON array brackets are to blame. But it's fine to have a JSON array as the top level element! You just need to use JSONArray() instead of JSONObject:

 String json_string = EntityUtils.toString(response.getEntity()); JSONArray temp1 = new JSONArray(json_string); 

So you have to know if you are getting a JSONArray or a single dictionary that is a JSONObject in your JSON code.

If you are used to the iOS/Objective-C JSON parsing libraries they use the same top level element to deal with json dictionaries and json array's, so moving to the JAVA / Android world confused me about having two types for handling JSON depending on the top level returned.

Sign up to request clarification or add additional context in comments.

Comments

2

With this class, you can get the JSON data from either from a server or from your assets folder. It can be easily changed to only one or the other. If you need a Adapter use the one jgilfelt created here on getHub.

@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Bundle getArgs = this.getArguments(); String URI = getArgs.getString(KEY_URI);//OR YOU CAN HARD CODE THIS OR GET THE STRING ANYWAY YOU LIKE. new GetJSONTask().execute(URI); } class GetJSONTask extends AsyncTask<String, Integer, String> { protected String doInBackground(String... arg0) { String uri = arg0[0]; InputStream is = null; if (uri.contains("http") == true) {// Get JSON from URL try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(uri); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8")); while ((line = rd.readLine()) != null) { json += line; } rd.close(); return json; } catch (Exception e) { e.printStackTrace(); return null; } } else {// Get JSON from Assets Writer writer = new StringWriter(); char[] buffer = new char[1024]; try { InputStream jsonFile = getActivity().getAssets().open(uri); Reader reader = new BufferedReader(new InputStreamReader(jsonFile, "UTF-8")); int n; while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } jsonFile.close(); } catch (IOException e) { e.printStackTrace(); } json = writer.toString(); // return JSON String return json; } } @Override protected void onPostExecute(String result) { try { showData(result); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(getActivity(), "something went wrong", Toast.LENGTH_SHORT).show(); } } } private void showData(String json) throws JSONException { JSONObject o = new JSONObject(json); JSONArray data = o.getJSONArray("results"); } } 

Comments

1

If I'm returning a JSON string from my web service, I usually want to get it back to a JSON object like so:

String response = client.getResponse(); if (responseCode == 200) { JSONObject obj = new JSONObject(response); } 

1 Comment

Looks cleaner, thanks for the input. However, the issue was php related, see my comment above.
1

The problem was in my php file. Removing the container array from the json encoded object made my java code work.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.