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.phpjson文字列を生成します。どうすれば自分からそれを取得できresponseますか?ところで; ライブラリを除外しましたが、GSONライブラリ内のメソッドを利用できますか?

これに似たソリューションはかなり醜いです、imo:httpresponseandroidからjsonを処理するための最良の方法

もっと良い方法がありますよね?

どんな助けでもありがたいです、ありがとう


アップデート:

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

トリックをするようです。小さな問題が1つだけあります。文字列がブラケットでラップされていること[]です。それらを手動で削除する必要がありますか?それらはphp:sによって生成されますjson_encode()

4

4 に答える 4

26

あなたが直面している問題は、私が今遭遇した問題と似ていると思います。実行する場合:

文字列json_string=EntityUtils.toString(response.getEntity());
JSONObject temp1 = new JSONObject(json_string);

上記のコードは例外をスローし、JSON配列ブラケットが原因のようです。ただし、最上位の要素としてJSON配列を使用することは問題ありません。JSONObjectの代わりにJSONArray()を使用する必要があります。

文字列json_string=EntityUtils.toString(response.getEntity());
JSONArray temp1 = new JSONArray(json_string);

したがって、JSONコードでJSONObjectであるJSONArrayまたは単一のディクショナリを取得しているかどうかを知る必要があります。

iOS / Objective-CのJSON解析ライブラリに慣れている場合、それらは同じトップレベルの要素を使用してjson辞書とjson配列を処理するため、JAVA / Androidの世界に移動すると、JSONを処理するための2つのタイプがあることに混乱しました。トップレベルが返されました。

于 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 に答える