web-dev-qa-db-fra.com

Envoi et analyse d'objets JSON sous Android

J'aimerais envoyer des messages sous forme d'objets JSON à un serveur et analyser la réponse JSON du serveur.

Exemple d'objet JSON

{
  "post": {
    "username": "John Doe",
    "message": "test message",
    "image": "image url",
    "time":  "current time"
  }
}

J'essaye d'analyser le JSON manuellement en allant attribut par attribut. Existe-t-il une bibliothèque/utilitaire que je peux utiliser pour faciliter ce processus?

134
Primal Pappachan

Je suis surpris qu'ils n'aient pas été mentionnés: mais GSon et Jackson sont beaucoup plus pratiques à utiliser qu'au lieu d'utiliser des processus simples et manuels avec le petit package de json.org. Alors:

Vous pouvez donc vous lier à vos propres POJO, et non à des nœuds d’arbres à moitié encombrés ou à des listes et à des cartes . (Et au moins Jackson autorise la liaison à de telles choses Liste, si vous voulez vraiment ces objets au lieu d'objets 'réels')

EDIT 19 MARS 2014:

Un autre nouveau concurrent est Jackson jr library: il utilise le même analyseur/générateur de flux rapide que Jackson (jackson-core), mais la partie de liaison des données est infime (50 Ko). La fonctionnalité est plus limitée (pas d'annotations, juste des Java Beans ordinaires), mais les performances doivent être rapides, et les frais généraux d'initialisation (au premier appel) très faibles également . C'est donc un bon choix, en particulier pour les applications plus petites .

118
StaxMan

Vous pouvez utiliser org.json.JSONObject et org.json.JSONTokener . vous n'avez pas besoin de bibliothèques externes puisque ces classes sont fournies avec Android SDK

85
Valentin Golev

GSON est le moyen le plus facile à utiliser et à utiliser si les données ont une structure définie.

Télécharger gson .

Ajoutez-le aux bibliothèques référencées.

package com.tut.JSON;

import org.json.JSONException;
import org.json.JSONObject;

import Android.app.Activity;
import Android.os.Bundle;
import Android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class SimpleJson extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        String jString = "{\"username\": \"tom\", \"message\": \"roger that\"}  ";


        GsonBuilder gsonb = new GsonBuilder();
        Gson gson = gsonb.create();
        Post pst;

        try {
            pst = gson.fromJson(jString,  Post.class);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

Code pour la classe postale

package com.tut.JSON;

public class Post {

    String message;
    String time;
    String username;
    Bitmap icon;
}

J'espère que ça aide.

Solution complète

30
Primal Pappachan

C'est la classe JsonParser

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }

Remarque: sdk 23 ne prend plus en charge DefaultHttpClient. Il est donc conseillé d'utiliser sdk 21 cible avec ce code.

4
www.9android.net

Il n'y a pas vraiment quelque chose à JSON. Les accolades correspondent aux "objets" (tableaux associatifs) et les crochets aux tableaux sans clé (indexés numériquement). En ce qui concerne son utilisation dans Android, il existe des classes prêtes à l'emploi pour cela inclus dans le sdk (aucun téléchargement requis).

Découvrez ces classes: http://developer.Android.com/reference/org/json/package-summary.html

3
Rich

Jackson et GSON, les bibliothèques JSON complémentaires populaires pour Android, et json.org, le package JSON simple inclus avec Android, ont également répondu à cette question.

Mais je pense qu'il est également intéressant de noter qu'Android a maintenant sa propre API JSON complète.

Cela a été ajouté dans Honeycomb: API niveau 11.

Cela comprend
- Android.util.JsonReader: docs et source
- Android.util.JsonWriter: docs et source

J'ajouterai également une considération supplémentaire qui me ramène à Jackson et à GSON: j'ai trouvé utile d'utiliser des bibliothèques tierces plutôt que des packages Android. * Car le code que j'écris peut alors être partagé entre le client et le serveur. Ceci est particulièrement pertinent pour quelque chose comme JSON, où vous pouvez vouloir sérialiser des données sur JSON à une extrémité pour les envoyer à l'autre extrémité. Dans de tels cas d'utilisation, si vous utilisez Java aux deux extrémités, évitez d'introduire des dépendances Android. *.

Ou bien je suppose que l’on pourrait récupérer le code source Android. * Pertinent et l’ajouter à votre projet de serveur, mais je n’ai pas essayé cela ...

2
Tom

il vous suffit d'importer ce

   import org.json.JSONObject;


  constructing the String that you want to send

 JSONObject param=new JSONObject();
 JSONObject post=new JSONObject();

im utilisant deux objets parce que vous pouvez avoir un jsonObject dans un autre 

post.put("username(here i write the key)","someusername"(here i put the value);
post.put("message","this is a sweet message");
post.put("image","http://localhost/someimage.jpg");
post.put("time":  "present time");

alors je mets le post json à l'intérieur d'un autre comme celui-ci

  param.put("post",post);

c'est la méthode que j'utilise pour faire une demande 

 makeRequest(param.toString());

public JSONObject makeRequest(String param)
{
    try
    {

établir la connexion 

        urlConnection = new URL("your url");
        connection = (HttpURLConnection) urlConnection.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
        connection.setReadTimeout(60000);
        connection.setConnectTimeout(60000);
        connection.connect();

réglage du flux de sortie

        dataOutputStream = new DataOutputStream(connection.getOutputStream());

j'utilise ceci pour voir dans le logcat ce que j'envoie

        Log.d("OUTPUT STREAM  " ,param);
        dataOutputStream.writeBytes(param);
        dataOutputStream.flush();
        dataOutputStream.close();

        InputStream in = new BufferedInputStream(connection.getInputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        result = new StringBuilder();
        String line;

ici la ficelle est construite 

        while ((line = reader.readLine()) != null)
        {
            result.append(line);
        }

j'utilise ce journal pour voir ce qui arrive dans la réponse 

         Log.d("INPUTSTREAM: ",result.toString());

instancer un json avec la chaîne qui contient la réponse du serveur

        jResponse=new JSONObject(result.toString());

    }
    catch (IOException e) {
        e.printStackTrace();
        return jResponse=null;
    } catch (JSONException e)
    {
        e.printStackTrace();
        return jResponse=null;
    }
    connection.disconnect();
    return jResponse;
}
1
Edgardo Alvarez

Vous pouvez télécharger une bibliothèque depuis http://json.org (Json-lib ou org.json) et l’utiliser pour analyser/générer le JSON.

1
Gaurav Vaish

si vous recherchez une analyse json rapide sous Android, je vous suggère un outil librement disponible.

Outil de création de classe JSON

Son utilisation est gratuite et vous pouvez créer votre classe d'analyse syntaxique JSON en moins de deux secondes. D

0
sachin

Il existe différentes bibliothèques open source que vous pouvez utiliser pour analyser json. 

org.json: - Si vous voulez lire ou écrire json, vous pouvez utiliser cette bibliothèque . Créez d'abord JsonObject: -

JSONObject jsonObj = new JSONObject(<jsonStr>);

Maintenant, utilisez cet objet pour obtenir vos valeurs: -

String id = jsonObj.getString("id");

Vous pouvez voir un exemple complet ici

Jackson databind: - Si vous voulez lier et analyser votre json à une classe POJO particulière, vous pouvez utiliser la bibliothèque jackson-databind. Cela liera votre json à la classe POJO: -

ObjectMapper mapper = new ObjectMapper();
post= mapper.readValue(json, Post.class);

Vous pouvez voir un exemple complet ici

0
Akash