从 HttpResponse 获取 json

2022-09-01 09:02:19
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 字符串。我如何从我的?顺便说一句;我已经排除了库,我可以利用其中的任何方法吗?responseGSON

与此类似的解决方案看起来很丑陋,imo:从httpresponse android处理json的最佳方式

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

任何帮助是赞赏的,谢谢


更新:

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

似乎在做这个把戏。只有一个小问题: 字符串用括号包裹 。我应该手动删除它们吗?它们由 php:s 生成[]json_encode()


答案 1

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

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

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

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

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

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


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