How to properly implement JSObject to provide conversion of Gson JsonElement objects?

Daniel Einspanjer deinspanjer at gmail.com
Thu May 25 19:57:46 UTC 2017


I have a project that makes extensive use of the Google Gson library.

In this particular case, I have a JsonArray object (which implements
iterable) containing a collection of objects.  In pure JSON it would look
like this:

[ 1, true, {"a": "b"}, [1,2] ]

In Gson JsonElements, it looks like this:

arr = new JsonArray();
arr.add(1);
arr.add(true);

obj = new JsonObject();
obj.addProperty("a", "b");

arr.add(obj);

innerArr = new JsonArray();
innerArr.add(1);
innerArr.add(2);

arr.add(innerArr);

I am calling a Javascript function in Nashorn that is trying to do a map
over this array:

nash.eval("function doIt(arr) { print(arr.map(function(item) { return
(typeof item); })); }");

So, in order for this to work with my own arbitrary object (JsonArray), I
believe I need to implement JSObject.

I created the wrapper class that implements it, using the underlying
JsonArray object as a delegate.  things like isArray() and such are
trivial, but I'm having trouble with the map.
I have a map method that takes a functional interface which is available
for the JsonArray object.

Nashorn calls getMember("map") when the doIt function is executed.  I
cannot figure out how to give it an appropriate function reference to my
JsonArray.map method.
I was able to handle getMember("toString") easily enough, but the problem
is that method doesn't take any arguments, so returning a simple
Callable<Object> is fine for it, but map is going to take arguments that I
don't know about ahead of time.

I would really appreciate some assistance here.  Thanks.

-Daniel


More information about the nashorn-dev mailing list