Just adding to what Jim said:
Nashorn script objects are exposed as objects of
jdk.nashorn.api.scripting.ScriptObjectMirror to Java.
The above class implements/extends these:
* javax.script.Bindings
-- which extends java.util.Map and makes keys to be Strings. This
lets you view script objects to be Map-like objects
* jdk.nashorn.api.scripting.JSObject
-- which has set/getMember (for named properties), set/getSlot (for
indexed properties), call to make "method"/"function" call on the object
Nashorn repo has
test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java - this
exercises features of nashorn's javax.script implementation. This can
serve as sample code for you.
hope this helps,
-Sundar
On Thursday 06 June 2013 01:21 AM, Jim Laskey (Oracle) wrote:
The repo you provided has empty JSON-java and JSON-js directories, so I'll give
you an alternative example. The main thing to note is that, because of a JS
object's dynamic nature, it can not mirror a Java object. A better analogy
would be to think of a JS object as a Map object, where properties are keys and
you access values with keys.
Run the enclosed example as follows;
javac Example.java
java Example
The class of myObject is a JSObject. You can access properties of a JSObject
with getMember/setMember (or getSlot/setSlot for integer keys.)
=== Example.java ===
import javax.script.*;
import jdk.nashorn.api.scripting.JSObject;
public class Example {
public static void main(String[] args) throws Exception {
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("nashorn");
engine.eval(new java.io.FileReader("Example1.js"));
JSObject myObject = (JSObject)engine.get("myObject");
System.out.println(myObject.getMember("a"));
System.out.println(myObject.getMember("b"));
System.out.println(myObject.getMember("c"));
myObject.setMember("d", "A new string");
engine.eval(new java.io.FileReader("Example2.js"));
}
}
=== Example1.js ===
var myObject = {
a: "A string",
b: 100,
c: true
}
=== Example2.js ===
print(myObject.d);
==== Output ===
A string
100
true
A new string
Cheers,
-- Jim
On 2013-06-05, at 3:50 PM, Mani Sarkar <[email protected]> wrote:
Hi,
I have another query regarding the example (see
https://github.com/neomatrix369/NashornHackDay/blob/master/examples/JSON_in_JS_and_Java/JSJSONInJava.java)
created sometime back during the Nashorn hackday. When I bring a JS object
created in Nashorn into Java I'm not able to access the object directly,
how do I access it like a normal java object.
If its a raw / primitive type then the contents are accessible (you can see
the value) while for JS object, when I say
*System.out.println(JSObjectFromNashorn);*
I get the below output
*[object object]*
The full implementation of what I'm talking about can be found at the above
link.
Regards,
mani
--
*Twitter:* @theNeomatrix369 *Blog:*
http://neomatrix369.wordpress.com
*JUG activity:* LJC Advocate (@adoptopenjdk & @adoptajsr programs)
*Meet-a-Project:* https://github.com/MutabilityDetector
*Bitbucket:* https://bitbucket.org/neomatrix369 * **Github:* https://github
.com/neomatrix369
*LinkedIn:* http://uk.linkedin.com/pub/mani-sarkar/71/a77/39b
*Devoxx UK 2013* was a grand success:
http://www.devoxx.com/display/UK13/Home
*Don't chase success, rather aim for "Excellence", and success will come
chasing after you!*