wake-up-neo.net

holen Sie sich Json von HttpResponse

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 generiert eine Json-Zeichenfolge. Wie würde ich es von meiner response holen? Übrigens; Ich habe die GSON-Bibliothek mit einbezogen, kann ich vielleicht irgendwelche Methoden verwenden?

Lösungen, die diesem ähnlich sind, sehen ziemlich hässlich aus, imo: der beste Weg, um Json von httpresponse Android zu handhaben

Es gibt viel bessere Wege, richtig?

Jede Hilfe wird geschätzt, danke


Update:

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

scheint den Trick zu tun. Es gibt nur ein kleines Problem: Der String wird in Klammern [] eingeschlossen. Soll ich sie manuell entfernen? Sie werden von PHP erzeugt: s json_encode()

26
Johan

Ich denke, das Problem, auf das Sie stoßen, ist eines, das meinem ähnlich ist, auf das ich gerade gestoßen bin. Wenn du läufst:

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

Der obige Code löst eine Ausnahme aus und es sieht so aus, als wären die Klammern des JSON-Arrays verantwortlich. Aber es ist in Ordnung, ein JSON-Array als oberstes Element zu haben! Sie müssen nur JSONArray () anstelle von JSONObject verwenden:

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

Sie müssen also wissen, ob Sie in Ihrem JSON-Code ein JSONArray oder ein einzelnes Wörterbuch, das ein JSONObject ist, erhalten. 

Wenn Sie an die iOS/Objective-C-JSON-Parsing-Bibliotheken gewöhnt sind, verwenden sie dasselbe Element der obersten Ebene, um mit Json-Wörterbüchern und Json-Arrays umzugehen. Daher verwirrte mich der Wechsel in die Java/Android-Welt darüber, dass es zwei Typen für den Umgang mit JSON gibt Top-Level zurückgegeben.

20
MikeN

Mit dieser Klasse können Sie die JSON-Daten entweder von einem Server oder von Ihrem Assets-Ordner abrufen. Es kann leicht zu einem oder dem anderen geändert werden. Wenn Sie einen Adapter benötigen, verwenden Sie den hier erstellten jgilfelt auf 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");
    }
}
2
user742030

Das Problem war in meiner PHP-Datei. Das Entfernen des Container-Arrays aus dem json-codierten Objekt hat meinen Java-Code zum Laufen gebracht.

1
Johan

Wenn ich eine JSON-Zeichenfolge von meinem Webservice zurücksende, möchte ich sie normalerweise wie folgt in ein JSON-Objekt zurückholen:

String response = client.getResponse();

    if (responseCode == 200)
    {                   
         JSONObject obj = new JSONObject(response);                                                             
    }
0
John J Smith