Envoi et analyse d’objets JSON dans Android [fermé]


137

Je souhaite 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'essaie d'analyser le JSON manuellement en allant attribut par attribut. Y a-t-il une bibliothèque / un utilitaire que je peux utiliser pour faciliter ce processus?


2
Cette URL n'est plus disponible ... pourriez-vous la mettre à jour?
Cipi

1
Voici un exemple détaillé: Android - Exemple d'analyse JSON
Paresh Mayani

1
@ Paresh Mayani & @ primpap .. Je sais que nous pouvons remplir les données du serveur en utilisant JSON reçu du serveur en utilisant la méthode get, je suis à l'aise avec cela .... mais si nous utilisons la méthode post pour envoyer les données au serveur, faites nous envoyons à nouveau les données au format JSON, je me réfère à la citation de la question primpap "Je voudrais envoyer des messages sous forme d'objets JSON à un serveur Django" ..... J'utilise Mysql sur le serveur .... ou J'envoie un objet JSON? ... pouvez-vous me clarifier cette information .... ou tout lien qui m'aide à comprendre le concept sera utile, merci
Devrath

Réponses:


118

Je suis surpris que ceux-ci n'aient pas été mentionnés: mais au lieu d'utiliser des processus manuels plutôt simples avec le petit paquetage de json.org, GSon et Jackson sont beaucoup plus pratiques à utiliser. Alors:

Ainsi, vous pouvez réellement vous lier à vos propres POJO, pas à des nœuds d'arbre à moitié assed ou à des listes et des cartes. (et au moins Jackson autorise également la liaison à de telles choses (peut-être GSON aussi, pas sûr), JsonNode, Map, List, si vous voulez vraiment ces objets au lieu d'objets `` réels '')

EDIT 19-MAR-2014:

Un autre nouveau concurrent est la bibliothèque Jackson jr : elle utilise le même analyseur / générateur de streaming rapide que Jackson ( jackson-core), mais la partie de liaison de données est minuscule (50 Ko). Les fonctionnalités sont plus limitées (pas d'annotations, juste des Java Beans classiques), mais les performances devraient être rapides et la surcharge d'initialisation (premier appel) très faible également. Cela pourrait donc être un bon choix, en particulier pour les petites applications.


10
+1 pour GSON. Nous avons particulièrement utilisé le support de diffusion en continu de GSON sur sites.google.com/site/gson/streaming dans nos applications Android.
Andre Steingress

FWIW, Jackson a également une API de streaming: wiki.fasterxml.com/JacksonStreamingApi
StaxMan

2
Également +1 pour le streaming GSON. Implémenté le streaming Jackson au début, mais bien que fonctionnel en version de débogage, ProGuard a généré des tonnes d'erreurs et la version de sortie provoque des plantages difficiles à localiser. Je suis sûr que ce n'est pas un problème lié à Jackson, mais cela m'a fait passer à GSON qui fonctionnait bien et ne nécessitait que 14 Ko supplémentaires pour le streaming.
sven

Et pour json stupide et imprévisible mélangeant des chaînes et des listes ex: ["toto", "tata", ["monty", ["tor", "python"]]]? (genre de structure de données nécessitant des fonctions récursives pour la consommer)
christophe31

85

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


Oups! J'ai manqué ça. En fait, ce sont les bibliothèques org.json sur le site Web.
Gaurav Vaish

C'est ce que j'utilise et cela fonctionne comme un charme.
Adam

Ce serait formidable si un exemple ou un lien vers le même pourrait être donné. C'est plus facile à apprendre de cette façon. :)
Primal Pappachan


1
Beaucoup plus de commodité, moins de code à écrire: une ou deux lignes au lieu de dizaines.
StaxMan le

31

GSON est le plus simple à utiliser et la voie à suivre si les données ont une structure définie.

Téléchargez 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 de poste

package com.tut.JSON;

public class Post {

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

4
Pour ce que ça vaut, le code peut être simplifié: cette conversion JSONObject n'est pas nécessaire. Et les setters et les getters sont facultatifs pour GSon; peut être ajouté si l'on veut, mais pas strictement nécessaire.
StaxMan

4
Juste pour clarifier le commentaire de StaxMan. Votre exemple prend jString, le convertit en JSONObject, puis le reconvertit en String pour que le gson le lise. Utilisez simplement pst = gson.fromJson (jString, Post.class). Je pense que cela éliminera également le besoin d'essayer. Et comme StaxMan le souligne également, les setters & getters dans Post.class n'ajoutent aucune valeur. Il serait utile aux autres de corriger votre exemple.
Matt

J'ai supprimé la partie double conversion de la réponse
whlk

4

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: DefaultHttpClient n'est plus pris en charge par sdk 23, il est donc conseillé d'utiliser la cible sdk 21 avec ce code.


3

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

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


Je suppose que vous vouliez dire des accolades et non des crochets angulaires!
Gaurav Vaish

2

D'autres réponses ont noté Jackson et GSON - les bibliothèques JSON complémentaires populaires pour Android, et json.org, le package JSON simple inclus dans Android.

Mais je pense qu'il convient également de noter qu'Android dispose désormais de 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 repousse vers Jackson et GSON: j'ai trouvé utile d'utiliser des bibliothèques tierces plutôt que des packages android. * Car alors le code que j'écris peut être partagé entre le client et le serveur. Ceci est particulièrement pertinent pour quelque chose comme JSON, où vous voudrez peut-être sérialiser des données en JSON à une extrémité pour les envoyer à l'autre extrémité. Pour des cas d'utilisation comme celui-là, si vous utilisez Java des deux côtés, cela permet d'éviter d'introduire des dépendances android. *.

Ou 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 ...



1

il vous suffit d'importer ceci

   import org.json.JSONObject;


  constructing the String that you want to send

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

im utilisant deux objets car 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");

puis je mets le post json dans un autre comme ça

  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
    {

établissement de 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 chaîne est construite

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

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

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

instanciation d'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;
}

merci pour votre temps à l'avance. J'utilise votre code pour envoyer une chaîne encodée en base64 au serveur django, mais lorsque je clique sur le bouton pour envoyer au serveur, l'application se bloque. Pouvez-vous m'aider à résoudre ce problème?
Noman marwat

0

si vous recherchez une analyse rapide de json dans Android, je vous suggère un outil disponible gratuitement.

Outil JSON Class Creator

Son utilisation est gratuite et crée votre classe d'analyse entièrement json en une à deux secondes.: D


0

Bien qu'il y ait déjà d'excellentes réponses fournies par les utilisateurs, par exemple encourager l'utilisation de GSON, etc. Je voudrais suggérer l'utilisation de org.json . Il comprend la plupart des fonctionnalités GSON. Il vous permet également de passer la chaîne json comme argument à son JSONObject et il s'occupera du reste, par exemple:

JSONObject json = new JSONObject("some random json string");

Cette fonctionnalité en fait ma préférée.


0

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 l'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 l'exemple complet ici

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.