0

My JSON response is an array of Object (Folder for example). I would like to generate an array of Folder objects using Javascript overlay types.

I tried the following method:

public static final native Folder[] buildFoldersArray(String json) /*-{
    return eval('(' + json + ')');
}-*/;

And the usage:

Folder[] folders = Folder.buildFoldersArray(myJSON);

Note: Folder extends JavaScriptObject as it should.

And the error I get:

java.lang.ClassCastException: com.google.gwt.core.client.JavaScriptObject$ cannot be cast to [Lcom.cnario.project.client.Folder;
    at com.cnario.project.client.Folder$.buildFoldersArray(Folder.java)
    at com.cnario.project.client.view.TreeView.FillTree(TreeView.java:51)
    at com.cnario.project.client.ManageContent$1.onResponseReceived(ManageContent.java:89)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
    at java.lang.Thread.run(Unknown Source)

What is the right way of retrieving objects array using JS Overlay types?

1 Answer 1

1

Problem solved: evaluation should return JsArrey<E> instead of E[]:

public static final native JsArray<Folder> buildFoldersArray(String json) /*-{      
    return eval('(' + json + ')');
}-*/;

Example usage:

JsArray<Folder> folder = Folder.buildFoldersArray(json);
item = new TreeItem(folder.get(0).getName());
Sign up to request clarification or add additional context in comments.

3 Comments

Please do not use eval()! Use JsonUtil.safeEval instead (or unsafeEval if you really need to).
@ThomasBroyer, Can you please elaborate about the differences between 'eval' and 'JsonUtil.safeEval' and how to implement it? Maybe you can post a link on the subject?
The javadoc says it all: safeToEval and unsafeEval; otherwise, search the web for why eval is utterly unsecure.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.