web-dev-qa-db-fra.com

obtenir json de 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 génère une chaîne json. Comment pourrais-je le chercher dans ma response? Btw; J'ai inclus la bibliothèque GSON, puis-je utiliser une méthode quelconque?

Des solutions similaires à celle-ci sont très laides, imo: meilleure façon de gérer json depuis httpresponse Android

Il y a beaucoup de meilleures façons, non?

Toute aide est la bienvenue, merci


Mettre à jour:

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

semble faire l'affaire. Il y a juste un petit problème: la chaîne est entourée de crochets []. Dois-je les supprimer manuellement? Ils sont générés par php: s json_encode()

26
Johan

Je pense que le problème que vous rencontrez est similaire à celui que je viens de rencontrer. Si vous courez:

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

Le code ci-dessus lève une exception et semble indiquer que les crochets du tableau JSON sont à blâmer. Mais c'est bien d'avoir un tableau JSON comme élément de niveau supérieur! Vous devez juste utiliser JSONArray () au lieu de JSONObject:

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

Vous devez donc savoir si vous obtenez un JSONArray ou un dictionnaire unique qui est un JSONObject dans votre code JSON. 

Si vous êtes habitué aux bibliothèques d'analyse syntaxique JSON iOS/Objective-C, elles utilisent le même élément de niveau supérieur pour gérer les dictionnaires json et les tableaux json. le niveau supérieur est revenu.

20
MikeN

Avec cette classe, vous pouvez obtenir les données JSON à partir d’un serveur ou de votre dossier d’actifs. Il peut être facilement changé à l'un ou l'autre. Si vous avez besoin d’un adaptateur, utilisez celui jgilfelt créé ici sur 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

Le problème était dans mon fichier php. La suppression du tableau de conteneurs de l'objet codé json a permis à mon code Java de fonctionner.

1
Johan

Si je retourne une chaîne JSON depuis mon service Web, je souhaite généralement la récupérer dans un objet JSON comme suit:

String response = client.getResponse();

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