2015-03-19 1 views
5

J'essaie de générer une structure de données dans le code JavaScript et de traiter les résultats à partir de Java (Rhino en Java 6 ou 7).Comment convertir une structure de données JSON produite par Rhino (NativeObject) en une structure de données Java?

je réussi à appeler la fonction JS de Java en utilisant:

Object result = invocableEngine.invokeFunction(functionName, parameters); 

Maintenant, sur le côté JS, ce résultat est une structure de données JSON comme suit:

{ 
    "key1" : { "key1_1" : "value1_1", "key1_2" : 11 }, 

    "key2" : [ { "key2_1": "foo2" 
       , "key2_1" : "bar2" }, 

      { "key2_1": "foo2" 
       , "key2_1" : "bar2" 
       , "key2_3" : [1,2,3] } ] 
} 

Du côté Java, cependant, "résultat" est un objet de type sun.org.mozilla.javascript.internal.NativeObject

Y at-il un moyen pour moi de le convertir en une structure de données Java raisonnable, sans avoir la surcharge de sérialiser ce JSON à une chaîne, puis en utilisant Gson pour l'analyser?

Supposons pour le moment que la structure de données est raisonnablement bien définie, par ex. Je sais que l'objet est un hachage avec les clés "key1" et "key2", les premières cartes à un hachage avec les clés "key1_1" et "key1_2"; la seconde correspond à un tableau de hachages, chacun d'entre eux ayant les clés "key2_1" et "key2_2" qui sont scalaires et "key2_3" qui est un tableau.

Mes 2 priorités sont, dans cet ordre:

  1. Performance (ce qui est l'une des raisons pour laquelle je me méfie des serialize + Gson-parse)
  2. portabilité entre Java 6, 7 et 8 (cependant , Je préférerais une solution non portable matériellement plus rapide).
+0

est-il un problème avec le laisser au format Rhino et y accéder grâce à ces données structure? Je reconnais que cela aurait un peu de frais généraux mais je ne pense pas qu'il existe des alternatives sans conversion en chaîne et désérialisation. – ghostbust555

+0

@ ghostbust555 - Je pense que "l'accès via le format Rhino" est une approche valable, mais je ne sais pas comment procéder.Il ne semble pas y avoir de documentation décente que je peux trouver, en particulier pour les hachages – DVK

+0

huh. wow ils ont juste la pire documentation de tous les temps. Essayez result.getAttributes ("key1")? – ghostbust555

Répondre

0

Vous pouvez analyser une chaîne JSON « objet » à l'aide Gson en analysant dans un LinkedTreeMap, comme ceci:

import com.google.gson.internal.LinkedTreeMap; 

String json = <your raw json> 
LinkedTreeMap map = new Gson().fromJson(json, LinkedTreeMap.class); 

Après analyse de votre entrée exemple, voici un exemple de comment l'utiliser:

System.out.println(((List<LinkedTreeMap>)map.get("key2")).get(1).get("key2_3")); 

sortie:

[1.0, 2.0, 3.0] 

Il est utile de connaître la structure au préalable, mais ce n'est pas essentiel car vous pouvez inspecter le type de chaque nœud à mesure que vous l'obtenez.

En ce qui concerne les performances, j'ai créé un exemple d'entrée avec 4 touches avec chacune plus de 400 entrées dans la liste. Après une mise en garde de la JVM, l'analyse a pris seulement 2ms sur mon vieux portable à basse spécification.

0

Vous pouvez créer un objet java depuis l'intérieur de json.

Quelque chose comme ça (je construis nouvelle java.lang.String, mais vous pouvez de la même construire votre propre classe):

java -jar js.jar 
Rhino 1.7 release 5 2015 01 29 
js> str=new java.lang.String("Hello world") 
Hello world 
js> java.lang.System.out.println(str) 
Hello world