Convertir une chaîne JSON en objet dans Java ME?


116

Existe-t-il un moyen en Java / J2ME de convertir une chaîne, telle que:

{name:"MyNode", width:200, height:100}

à une représentation objet interne de la même chose, dans une ligne de code?

Parce que la méthode actuelle est trop fastidieuse:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

Peut-être une bibliothèque JSON?


6
Votre chaîne n'est pas vraiment un objet Json, voir le standard Json ... C'est plutôt une notation JavaScript.
PhiLho

19
@Jeremy Rudd: Devrait être{"name":"MyNode", "width":200, "height":100}
Esteban Küber

1
@voyager: Je sais, mais JavaScript prend en charge nativement les noms de propriétés sans guillemets.
TheFlash

1
@PhiLho: Je le sais, mais je l'ai gardé ainsi pour des raisons de clarté. Le surligneur de syntaxe SO aurait tout gâché. Nom et valeur en rouge.
TheFlash

Existe-t-il un moyen de faire la conversion à l'aide des API principales de Java? Peut-être en Java 8? Java 9?
AlikElzin-kilaka

Réponses:


109

J'en ai utilisé quelques-uns et mon préféré est,

http://code.google.com/p/json-simple/

La bibliothèque est très petite, elle est donc parfaite pour J2ME.

Vous pouvez analyser JSON en objet Java en une seule ligne comme ceci,

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));

1
Puis-je utiliser cette bibliothèque dans une applet. S'il utilise Reflection, je vais être confronté à une erreur de réflexion. Cela fonctionnerait-il?
Mridang Agarwalla

JsonSimple a-t-il toujours la classe JSONParser? Je ne peux pas appeler la classe.
phuwin

JSONParser est désormais obsolète.
Varda Elentári

79

L'option la plus simple est Jackson :

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

Il existe d'autres bibliothèques tout aussi simples à utiliser (Gson a déjà été mentionné); mais certains choix sont plus laborieux, comme la bibliothèque org.json d'origine, qui vous oblige à créer un "JSONObject" intermédiaire même si vous n'en avez pas besoin.


Jackson ne prend pas en charge J2ME
skue

Certes, si j2me est toujours à peu près au niveau JDK 1.4 (Jackson nécessite 1,5)
StaxMan

1
Vous n'avez que 2 hausses, mais vous méritez plus. Jackson était vraiment facile à installer sur notre application. Merci d'avoir recommandé.
Dan Doyon

1
Jackson peut également désérialiser en un objet simple. par exemple. Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
neoneye

Plus d'exemples de code utilisant Jackson: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

GSON est une bonne option pour convertir un objet java en objet json et vice versa.
C'est un outil fourni par google.

pour convertir json en objet java, utilisez: fromJson(jsonObject,javaclassname.class)
pour convertir un objet java en objet json utiliser: toJson(javaObject)
et le reste sera fait automatiquement

Pour plus d' informations et pour télécharger


1
+1 Je cherchais quelque chose de similaire et cela correspond parfaitement à la facture!
Roy Tang

23

Vous pouvez le faire facilement avec Google GSON.

Supposons que vous ayez une classe appelée User avec les champs user, width et height et que vous souhaitiez convertir la chaîne json suivante en objet User.

{"name":"MyNode", "width":200, "height":100}

Vous pouvez facilement le faire, sans avoir à lancer (en gardant à l'esprit le commentaire de nimcap;)), avec le code suivant:

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

Où jsonString est la chaîne JSON ci-dessus.

Pour plus d'informations, consultez https://code.google.com/p/google-gson/


3
Et oui, je me rends compte que la question a été posée il y a 4 ans, mais ma réponse s'adresse aux parties intéressées qui doivent le faire actuellement :) J'espère que cela aide quelqu'un!
sufinawaz

22

Vous disposez de nombreux analyseurs JSON pour Java :

  • JSONObject.java
    Un JSONObject est une collection non ordonnée de paires nom / valeur. Sa forme externe est une chaîne entourée d'accolades avec deux points entre les noms et les valeurs, et des virgules entre les valeurs et les noms. Le formulaire interne est un objet ayant les méthodes get () et opt ​​() pour accéder aux valeurs par nom, et les méthodes put () pour ajouter ou remplacer des valeurs par nom. Les valeurs peuvent être de l'un des types suivants: Boolean, JSONArray, JSONObject, Number et String, ou l'objet JSONObject.NULL.

  • JSONArray.java
    Un JSONArray est une séquence ordonnée de valeurs. Sa forme externe est une chaîne placée entre crochets avec des virgules entre les valeurs. Le formulaire interne est un objet ayant les méthodes get () et opt ​​() pour accéder aux valeurs par index, et les méthodes put () pour ajouter ou remplacer des valeurs. Les valeurs peuvent être de l'un des types suivants: Boolean, JSONArray, JSONObject, Number et String, ou l'objet JSONObject.NULL.

  • JSONStringer.java
    Un JSONStringer est un outil permettant de produire rapidement du texte JSON.

  • JSONWriter.java
    Un JSONWriter est un outil permettant d'écrire rapidement du texte JSON dans des flux.

  • JSONTokener.java
    Un JSONTokener prend une chaîne source et en extrait des caractères et des jetons. Il est utilisé par les constructeurs JSONObject et JSONArray pour analyser les chaînes source JSON.

  • JSONException.java
    Une exception JSONException est lancée lorsqu'une erreur de syntaxe ou de procédure est détectée.

  • JSONString.java
    Le JSONString est une interface qui permet aux classes d'implémenter leur sérialisation JSON.


1
Si J2ME a java.io.IOException; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet ;, alors vous pouvez utiliser le premier, car ce sont des javaclasses simples .
Esteban Küber

2
Je pense qu'il n'y a pas de package java.lang.reflect dans MIDP 2.0. Cela rendra difficile de faire un analyseur générique ...
PhiLho

2
Smart guy, voyageur, vous venez de copier dans la documentation standard des classes Java JSON.
TheFlash

@Jeremy Rudd: bien sûr que je l'ai fait, comment as-tu pensé que je l'ai fait si vite? Ce n'était pas une tentative de vous troller, sa pratique standard à la fois lier et copier. Je suis désolé si ça s'est passé de cette façon.
Esteban Küber

10
J'ai voté contre cela parce qu'il ne répond pas à la question. Cela donne une liste de classes liées mais aucune d'entre elles n'accomplit réellement ce que le demandeur veut.
Jeff Martin du

7

Le site officiel JSON est l'endroit où vous devriez regarder. Il fournit diverses bibliothèques qui peuvent être utilisées avec Java, j'ai personnellement utilisé celle-ci, JSON-lib qui est une implémentation du travail dans le site, donc elle a exactement la même classe - méthodes, etc. dans cette page .

Si vous cliquez sur les liens html, vous pouvez trouver tout ce que vous voulez.

En bref:

pour créer un objet json et un tableau json, le code est:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1, o2, peuvent être des types primitifs (long, int, booléen), des chaînes ou des tableaux.

Le processus inverse est assez simple, je veux dire la conversion d'une chaîne en objet / tableau json.

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

Pour être correctement analysé, il vous suffit de savoir si vous analysez un tableau ou un objet.



5

Comme beaucoup l'ont déjà dit, un moyen assez simple de le faire en utilisant JSON.simple comme ci-dessous

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

Et puis utilisez jsonObj pour traiter l'objet JSON. par exemple jsonObj.get ("nom");

Selon le lien ci-dessous, JSON.simple montre une efficacité constante pour les petits et grands fichiers JSON

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/


Vous avez écrit que beaucoup ont déjà fait la suggestion que vous avez publiée. Quelle est l'essence de votre réponse?
dakab

1
@dakab Merci pour vos commentaires. L'essence de cette question était de donner une ligne de code qui fait le but. Et comme il existe de nombreuses apis disponibles pour ce faire, je voulais juste donner quelques informations supplémentaires sur la comparaison de l'efficacité des apis. Donc, l'essence de cette réponse que je voulais dire était de donner le code + quelques informations sur la comparaison des efficacités des différents apis mentionnés par d'autres boursiers dans ce fil.
Kripz


3

C'est une vieille question et json-simple ( https://code.google.com/p/json-simple/ ) pourrait être une bonne solution à ce moment-là, mais veuillez considérer que le projet ne semble pas être actif pendant un certain temps!

Je suggère le Gson qui est maintenant hébergé sur: https://github.com/google/gson

Si la performance est votre problème, vous pouvez jeter un œil à quelques benchmarks http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ qui se comparent.



2

J'ai écrit une bibliothèque qui utilise json.org pour analyser JSON, mais elle créera en fait un proxy d'une interface pour vous. Le code / JAR se trouve sur code.google.com.

http://fixjures.googlecode.com/

Je ne sais pas si cela fonctionne sur J2ME. Puisqu'il utilise Java Reflection pour créer des proxys, je pense que cela ne fonctionnera pas. En outre, il a actuellement une forte dépendance à l'égard des collections Google que je souhaite supprimer et il est probablement trop lourd pour vos besoins, mais cela vous permet d'interagir avec vos données JSON de la manière que vous recherchez:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");

Incroyable, même si je ne veux pas de Foo, juste l'objet natif.
TheFlash

2

Créez simplement un objet Json en java avec la chaîne Json suivante.

{name:"MyNode", width:200, height:100}

si ce qui précède est votre chaîne Json, créez simplement un objet Json avec.

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));

2

Jackson pour les gros fichiers, GSON pour les petits fichiers et JSON.simple pour gérer les deux.


1
preuve pour sauvegarder le commentaire de @ thanga à partir d'ici blog.takipi.com
...

J'ai déjà vu cela auparavant, mais je considère également que les petits fichiers sont rapides à analyser de toute façon. Je ne penserais à JSON.simple que si vous avez une tonne de petits fichiers à analyser où cette différence d'environ 30% par rapport à Jackson va s'additionner. Voir également les principaux commentaires, cette référence n'est peut-être pas trop fiable. Vraiment, si la vitesse est si importante pour vous, vous devriez probablement concevoir de sorte que vous puissiez injecter un analyseur pour changer facilement les implémentations et faire vos propres tests de référence.
Utilisateur
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.