web-dev-qa-db-fra.com

Lequel utiliser? JSONObject de org.json VS JsonObject de javax.json

Ceci est mon premier message posté. En tant que développeur Android en herbe, j'ai lu SO presque tous les jours sur divers sujets, mais pour cette question, je n'ai trouvé aucune aide de Google ou de SO.

Mes recherches jusqu'à présent:
La recherche de cette question était plus ardue que d'habitude car les moteurs de recherche ne semblent pas se soucier de la sensibilité à la casse, ce qui est essentiel dans ce numéro. La recherche sur Google ne m'a donné que des liens vers les classes elles-mêmes, des articles anciens ou des articles totalement non pertinents. Le plus proche que j'ai eu était JSONArray vs JSONObject, et c'est une question complètement différente. La recherche SO a donné les mêmes résultats. Autant que je sache, TOUS les articles pertinents sur SO font référence à JSONObject et non à JsonObject.

Ni la documentation d'Oracle ni de json.org n'ont mentionné l'autre côté, pas plus que la page de développeur Android JSONObject qui utilise la bibliothèque org.json.

http://docs.Oracle.com/javaee/7/api/javax/json/JsonObject.html
http://www.json.org/javadoc/org/json/JSONObject.html
J'aurais également posté un lien vers la page de référence Android pour JSONObject, mais mon représentant en tant que débutant est trop faible.

Historique du (des) problème (s): Je lisais des informations sur l’encodage et le décodage Json à partir de la page Oracle et j’essayais de copier et coller dans mon IDE AndriodStudio, ce qui produisait immédiatement une erreur, pour laquelle cela ne suggérait pas une instruction d’importation comme celle-ci. c'est normalement le cas. J'ai appris que cela signifie que la classe ne fait pas partie des bibliothèques intégrées.

Le problème était que le code que j'ai collé utilisait JsonObject (qui provient de la bibliothèque javax.json) et non JSONObject (qui venait de la bibliothèque org.json). Quand j'ai remarqué la différence de casse entre la page Android et la page Oracle, j'ai modifié mon code de Json en JSON et immédiatement mon IDE a proposé l'instruction d'importation org.json.

Question (s): Pourquoi une classe créée par Oracle ne fait-elle pas partie des bibliothèques par défaut quand une bibliothèque externe l’est?
Est-ce que JSON est l'ancienne méthode, obsolète et Json, une nouvelle méthode?
Sont-ils fonctionnellement identiques? Si non, veuillez donner des exemples?
Certaines situations sont-elles meilleures pour l'un et d'autres pour l'autre?
ULTIMATELY, lequel devrais-je utiliser et pourquoi (si pas déjà couvert)?
Si, javax.json, où est le meilleur endroit (le plus sûr) pour télécharger cette bibliothèque)?

26
Phyxius81

Un peu tard, mais je voulais partager mon opinion à ce sujet.

J'ai rencontré ce problème récemment lorsque j'ai trouvé un projet Java avec les deux bibliothèques et qu'elles étaient utilisées en même temps.

Je pense que org.json est plus facile à lire et à utiliser, pour 2 raisons principales (pour mes besoins):

  1. JsonObject est immuable. Vous ne pouvez pas ajouter de nouvelles paires clé/valeur à un JsonObject déjà existant (référence ici: javax.json: Ajouter un nouveau JsonNumber à un JsonObject existant )

  2. Il faut quelques lignes pour imprimer assez JsonObject ou JsonArray, alors qu’il ne faut qu’une ligne pour le faire avec JSONObject ou JSONArray. Exemple:

    StringWriter sw = new StringWriter();
    Map<String, Object> properties = new HashMap<>();
    properties.put(JsonGenerator.PRETTY_PRINTING, true);
    
    JsonWriterFactory writerFactory = Json.createWriterFactory(properties);
    JsonWriter jsonWriter = writerFactory.createWriter(sw);
    
    jsonWriter.writeObject(jsonObject); //JsonObject created before
    jsonWriter.close();
    String prettyPrintedJSON = sw.toString();
    

C’est le code que j’utilise pour obtenir un JSON en retrait à écrire dans un fichier. Et avec org.json je n’ai besoin que de jsonObject.toString(4)

Une autre différence concerne les constructeurs. Vous aurez besoin d'une JsonObjectBuilder pour créer un JSON avec javax.json. Un pas de plus qui peut être évité.

Je suis sûr qu'il y a plus de différences (pas sûr s'il est possible de créer une JsonObject à partir d'une chaîne) mais ce sont mes pensées.

14
Samuel Méndez

Comme mentionné, JSONObject est fourni par l'API d'Android. JsonObject est spécifiquement utilisé pour le développement Java EE, principalement pour les applications Web et les fonctionnalités réseau. 

La raison pour laquelle Android ne préemballe pas le package JsonObject d'Oracle Java EE est que beaucoup de choses que javax peut faire ne sont pas autorisées dans Android, comme accéder à Internet sans autorisation. Cela signifie que l'importation de tous les fichiers jars de javax entrerait en conflit avec Android.

Si vous envisagez de créer votre propre backend avec Java EE, je vous suggère fortement d'utiliser JsonObject plutôt que JSONObject. D'autre part, si vous connaissez un service de repos pré-construit ou quelque chose de similaire qui supporte encore mieux le JSON d'Android. 

2
Full Stack

Je vous recommande d'utiliser le fichier json-simple toolkit de Google pour pouvoir utiliser les objets JSON. Il fournit des fonctions utiles et ne dépend pas de bibliothèques externes, ce qui s’est avéré être un énorme problème lors du développement d’applications Android.

Pour répondre à votre question: si vous ne voulez pas utiliser json-simple dans votre projet, vous devez utiliser le JSONObject de org.json, car il est fourni par le JDK Android. Pour plus d'informations, voir http://developer.Android.com/reference/org/json/JSONObject.html .

0
michip96