从HttpResponse获取JSON

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生成一个JSONstring。 我如何从我的response获取? 顺便说一句, 我已经GSONGSON库,我可以使用它的任何方法吗?

类似于这个的解决scheme看起来很丑陋,imo: 从httpresponse android处理json的最好方法

有很多更好的方法,对吗?

任何帮助表示赞赏,谢谢


更新:

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

似乎在做伎俩。 只有一个小问题:string用括号[]括起来。 我应该手动删除它们吗? 它们是由php生成的: json_encode()

Solutions Collecting From Web of "从HttpResponse获取JSON"

我认为你遇到的问题与我刚碰到的类似。 如果你运行:

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

上面的代码会抛出一个exception,它看起来像JSON数组括号是怪罪。 但是,将JSON数组作为顶级元素是很好的! 你只需要使用JSONArray()而不是JSONObject:

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

所以你必须知道你是否得到了JSON代码中的JSONArray或是JSONObject的单个字典。

如果您习惯了iOS / Objective-C JSONparsing库,他们使用相同的顶级元素来处理json字典和json数组,所以移到JAVA / Android世界困惑我有两种types来处理JSON,这取决于顶级返回。

通过这个类,您可以从服务器或资产文件夹中获取JSON数据。 它可以很容易地更改为只有一个或另一个。 如果您需要使用适配器,请使用getHub上创build的一个jgilfelt 。

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

问题是在我的PHP文件。 从json编码的对象中删除容器数组使我的java代码工作。

如果我从我的web服务中返回一个JSONstring,我通常想把它返回到一个JSON对象,如下所示:

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