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?
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 .
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
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.
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.
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
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 ...
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;
}
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.
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
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