2015-03-19 14 views
5

Sto provando a generare una struttura dati all'interno del codice JavaScript ed elaborare i risultati da Java (Rhino in Java 6 o 7).Come posso convertire una datastruttura JSON prodotta da Rhino (NativeObject) in una infrastruttura dati Java?

sono riuscito a invocare la funzione JS da Java utilizzando:

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

Ora, sul lato JS, quel risultato è una struttura dati JSON come segue:

{ 
    "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] } ] 
} 

Sul lato Java, tuttavia, "risultato" è un oggetto di tipo sun.org.mozilla.javascript.internal.NativeObject

C'è un modo per me di convertirlo in una ragionevole infrastruttura Java, senza avere il sovraccarico di serializzare quel JSON su una stringa e quindi usare Gson per analizzarlo?

Si supponga per il momento che la struttura dati sia ragionevolmente ben definita, ad es. So che l'oggetto è un hash con le chiavi "key1" e "key2", le prime mappe ad un hash con le chiavi "key1_1" e "key1_2"; il secondo mappa una serie di hash, ognuno dei quali ha le chiavi "key2_1" e "key2_2" che sono scalari e "key2_3" che è una matrice.

Le mie priorità sono 2, in questo ordine:

  1. prestazioni (che è uno dei motivi per cui io sono diffidare di serializzare + GSON-parse)
  2. portabilità tra Java 6, 7 e 8 (tuttavia , Preferirei una soluzione non portatile materialmente più veloce).
+0

c'è un problema a lasciare in formato Rhino e l'accesso attraverso i dati struttura? Riconosco che avrebbe qualche sovraccarico, ma non penso ci siano alternative senza convertirsi a stringhe e deserializzare. – ghostbust555

+0

@ ghostbust555 - Penso che "accedere attraverso il formato di Rhino" sia un approccio valido, ma non sono sicuro di come farlo.Non sembra esserci alcuna documentazione decente che riesca a trovare, specialmente per gli hash – DVK

+0

eh. wow hanno solo la peggiore documentazione di tutti i tempi. Prova result.getAttributes ("key1")? – ghostbust555

risposta

0

È possibile analizzare qualsiasi "oggetto" stringa JSON utilizzando Gson analizzando in una LinkedTreeMap, come questo:

import com.google.gson.internal.LinkedTreeMap; 

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

Dopo l'analisi vostro input di esempio, ecco un esempio di come usarlo:

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

uscita:

[1.0, 2.0, 3.0] 

Aiuta a conoscere la struttura in anticipo, ma non è essenziale perché è possibile ispezionare il tipo di ogni nodo man mano che si ottiene.

Per quanto riguarda le prestazioni, ho creato input di esempio con 4 chiavi ciascuna con oltre 400 voci nell'elenco. Dopo l'avviso di JVM, l'analisi ha richiesto solo 2 ms sul mio vecchio laptop a bassa specifica.

0

È possibile creare oggetti java dall'interno di json.

Qualcosa di simile a questo (sto costruendo nuovi java.lang.String, ma allo stesso modo è possibile costruire la propria 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