2010-10-19 25 views
2

Nous mettons à jour notre application Web pour utiliser l'API graphique de Facebook, qui renvoie les réponses JSON. Cependant, nous ne voulons pas ajouter dépendance à une bibliothèque JSON sauf si nous n'avons pas d'autre choix. Pour les requêtes http côté serveur, nous utilisons Apache HttpComponents.est-il possible de traiter les réponses JSON avec le JDK ou HttpComponents seulement?

Ainsi, ma question est quelles sont les classes (le cas échéant) dans le JDK et/ou dans HttpComponents que je peux utiliser pour traiter les réponses JSON? Les extraits de code sont les bienvenus :)

+5

Qu'est-ce exactement est la raison d'être de l'aversion "extra library"? Le problème de base pourrait devoir être résolu ailleurs. – BalusC

Répondre

3

Il n'y en a pas est l'API javax.script comme mentionné par @McDowell, mais le JSON syntax est assez trivial. Vous pouvez écrire vous-même un analyseur basé sur la pile qui détermine la chaîne JSON char-by-char et convertit les tableaux JSON [] en Object[] ou List<Object> et les objets JSON {} en Map<String, Object>. C'est un bel exercice d'apprentissage. Cependant, quand vous ne voulez pas vous soucier de la robustesse et de la maintenance à long terme, alors je vous suggère de simplement choisir l'une des bibliothèques Java listées au bas de this page. Mon préféré est Google Gson. Il peut nicely convertir des structures JSON complexes en Javabeans complets et réutilisables.

+1

+1 pour l'utilisation de Gson. – ColinD

+1

Pour analyser JSON, la spécification est ici: http://www.ietf.org/rfc/rfc4627.txt – McDowell

2

C'est possible. Étant donné que JSON est une syntaxe JavaScript valide, vous pouvez utiliser l'interpréteur JavaScript intégré via le scripting API pour créer et mettre en forme un graphique, puis le parcourir (en utilisant le modèle de visiteur pour transférer des données dans un objet Java, par exemple). Cependant, vous devez faire confiance aux données ou vous vous laissez ouvert aux attaques par injection de code. Pour moi, ce ne serait pas un substitut adéquat pour un analyseur JSON approprié.

+0

Oh, j'ai complètement oublié l'API 'javax.script' de Java 1.6. Cependant, je suis entièrement d'accord que cela laisse des trous d'injection ouverts. Je ne l'utiliserais pas. Indépendamment de +1 pour l'illumination. – BalusC

2

Je pense que ce que vous cherchez est le paquet org.json. Vous pouvez obtenir la source here et inclure simplement la poignée de fichiers dans votre projet, il n'a aucune dépendance. Cela vous permettra de créer et d'analyser JSON. Les javadocs sont bien faits et peuvent être trouvés here. Par exemple, pour consommer json, vous pouvez utiliser un tokener et convertir la chaîne brute en objet JSONObject. Ensuite, vous pouvez accéder aux tableaux par index ou par clé. Vous pouvez accéder aux tableaux imbriqués en les obtenant en tant que JSONObject ou JSONArray.

JSONTokener tokener = new JSONTokener(myJsonString); 
JSONObject json = new JSONObject(tokener); 

String error = json.get("error"); 
int errorCode = json.getInt("error_code"); 

JSONArray messages = json.getJsonArray("messages"); 
+0

Les liens sont morts, penses-tu que tu puisses les mettre à jour? Merci. – stefanobaghino

2

Malheureusement, JSON natif prend en charge was delayed past Java 9.

Mais pour le bien de sportivité ici est la solution hacky Java 8 ordinaire avec Nashorn moteur JavaScript sans dépendance externe:

String json = "{\"foo\":1, \"bar\":\"baz\"}"; 
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
Object o = engine.eval(String.format("JSON.parse('%s')", json)); 
Map<String, String> map = (Map<String, String>) o; 
System.out.println(Arrays.toString(map.entrySet().toArray())); 
// [foo=1, bar=baz] 

Crédits:

Effective way to pass JSON between java and javascript

https://dzone.com/articles/mapping-complex-json-structures-with-jdk8-nashorn