Reputation: 35223
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()
Upvotes: 33
Views: 112063
Reputation: 46387
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.
Upvotes: 27
Reputation: 35223
The problem was in my php file. Removing the container array from the json encoded object made my java code work.
Upvotes: 1
Reputation:
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");
}
}
Upvotes: 2
Reputation: 11941
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);
}
Upvotes: 1