32
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生成一个 json 字符串。我将如何从我的response? 顺便提一句; 我已经包含了GSON图书馆,我可以使用其中的任何方法吗?

类似于这个的解决方案看起来很丑陋,imo: best way to handle json from httpresponse android

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

任何帮助表示赞赏,谢谢


更新:

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

似乎可以解决问题。只有一个小问题:字符串用括号括起来[]。我应该手动删除它们吗?它们由 php:s 生成json_encode()

4

4 回答 4

26

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

字符串 json_string = EntityUtils.toString(response.getEntity());
JSONObject temp1 = new JSONObject(json_string);

上面的代码会抛出异常,看起来 JSON 数组括号是罪魁祸首。但是可以将 JSON 数组作为顶级元素!您只需要使用 JSONArray() 而不是 JSONObject:

字符串 json_string = EntityUtils.toString(response.getEntity());
JSONArray temp1 = new JSONArray(json_string);

因此,您必须知道在您的 JSON 代码中获取的是 JSONArray 还是作为 JSONObject 的单个字典。

如果您习惯于 iOS/Objective-C JSON 解析库,它们使用相同的顶级元素来处理 json 字典和 json 数组,因此迁移到 JAVA/Android 世界让我感到困惑,因为有两种类型来处理 JSON,具体取决于顶层返回。

于 2014-03-25T03:16:03.877 回答
2

使用此类,您可以从服务器或资产文件夹中获取 JSON 数据。它可以很容易地更改为只有一个或另一个。如果您需要适配器,请使用在getHub 上创建的 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");
    }
}
于 2012-06-20T23:09:08.443 回答
1

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

于 2012-06-20T23:16:36.390 回答
0

如果我从我的 Web 服务返回一个 JSON 字符串,我通常希望将它返回到一个 JSON 对象,如下所示:

String response = client.getResponse();

    if (responseCode == 200)
    {                   
         JSONObject obj = new JSONObject(response);                                                             
    }
于 2012-06-20T23:02:17.010 回答