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!*

Reply via email to