età Questa domanda è stato chiesto prima, ma le risposte sembravano ancora corrette. Nel caso in cui sia interessante per chiunque altro cerchi di passare oggetti complessi tra Java e Javascript, ho voluto presentare la mia soluzione.
Ho scritto uno script che converte il NativeObject in oggetti JSON (in memoria) (in realtà utilizzo gli oggetti basati su BSON di MongoDB, ma dovresti essere in grado di sostituire 1-1 per JSONArray e JSONObject nel codice di esempio seguente).
Così, per esempio, dire che ho un (utente) script "create_object_script", che "restituisce" un oggetto o un array di interesse, allora posso convertirlo in JSON (cioè un elenco di HashMaps) come segue:
Object returnVal = engine.eval(create_object_script);
engine.put("output", returnVal);
BasicDBObject objFactory = new BasicDBObject(); // (or JSON equivalent)
BasicDBList listFactory = new BasicDBList(); // (or JSON equivalent)
BasicDBList outList = new BasicDBList(); // (or JSON equivalent)
engine.put("objFactory", objFactory);
engine.put("listFactory", listFactory);
engine.put("outList", outList);
engine.eval(parsing_script); // (described below)
// "outList" is now populated with (in-memory) JSON representations of "returnVal"
Ovviamente se si ha il controllo sullo script "create_object_script" è possibile farlo in un unico passaggio; i miei script sono generati dall'utente, quindi è necessario nascondere questa complessità: gli utenti scrivono solo script in cui il "valore di ritorno" è la linea finale.
Ho irrigidito lo "parsing_script" here per mantenere la lunghezza di questo post in basso.
Funzionalmente funziona molto bene; Non ho sviluppato in JS tanto è possibile che ci siano modi più efficienti per farlo. (Nota ho sempre bisogno dei miei risultati in una lista, se non lo fai allora potresti passare in un BasicDBObject "outObj" e scrivere a quello invece nel caso singleton).
Spero che questo aiuti qualcuno che si trova nella mia situazione all'una di notte scorsa!
fonte
2012-01-06 17:16:00