【问题标题】:How can I get javascript array output in java (in array)?如何在 java 中获取 javascript 数组输出(在数组中)?
【发布时间】:2018-03-25 05:59:39
【问题描述】:

我有一个 javascript 文件 fun.js

function fun1(){
    var arr =['This','is','from','js'];
    return arr;
}

我想在 java 数组中获取这个数组,所以我使用 nashorn as-

try{
    ScriptEngine engine= new ScriptEngineManager().getEngineByName("nashorn");
    engine.eval(new FileReader("fun.js"));
    Invocable invocable = (Invocable) engine;
    Object obj = (Object)invocable.invokeFunction("fun1");
    System.out.println(obj.toString());
}
catch(Exception e){
    e.printStackTrace();
}

但是我得到了这个输出- [对象数组]

我怎样才能得到这个输出为java数组

【问题讨论】:

  • eval() 是你在任何语言中做过的最糟糕的事情之一。
  • 您是否尝试循环遍历数组并打印出内容?
  • 应该将类型转换为 Object[] 然后使用 for 循环。
  • @Prashant 它给出了错误 -- java.lang.ClassCastException: jdk.nashorn.api.scripting.ScriptObjectMirror 不能被转换为 [Ljava.lang.Object;
  • 你的文件 fun.js 的内容是什么。也请显示方法代码fun1

标签: javascript java arrays nashorn


【解决方案1】:
public static void main(String[] args) throws JSONException, FileNotFoundException, ScriptException, NoSuchMethodException {

        ScriptEngine engine= new ScriptEngineManager().getEngineByName("nashorn");

        engine.eval(new FileReader("C:\\Users\\Niku\\eclipse-workspace\\java_sample\\src\\test.js"));

        Invocable invocable = (Invocable) engine;
        Object obj = (Object)invocable.invokeFunction("fun1");
        Gson gson = new Gson();
        String k = gson.toJson(obj);
        JSONObject o = new JSONObject(k);
        System.out.println(o.getString("0"));
        System.out.println(o.getString("1"));
        System.out.println(o.getString("2"));
        System.out.println(o.getString("3"));

        Iterator x = o.keys();
        JSONArray jsonArray = new JSONArray();
        ArrayList<String> ar = new ArrayList<String>();
        while (x.hasNext()){
            String key = (String) x.next();
            ar.add(o.get(key).toString());
            jsonArray.put(o.get(key));
        }

        System.out.println(ar);
}

遍历 JsonObject 可以获得每个元素,这些元素可以添加到另一个要使用的数组中。

【讨论】:

    【解决方案2】:

    您可以使用 Nashorn 特定扩展对象“Java”的方法在 JavaScript 和 Java 数组之间进行转换。

    另请参阅:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-java_to

    从 Java 代码调用 Java.to 的简单示例:

    import javax.script.*;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            ScriptEngine e = new ScriptEngineManager().getEngineByName("nashorn");
            e.eval("function fun1() { return ['this', 'is', 'from', 'js']; }");
            Invocable invocable = (Invocable)e;
            Object obj = (Object)invocable.invokeFunction("fun1");
            // get "Java" api object
            Object Java = e.get("Java");
            // invoke Java.to function to convert JS array to Java String array
            String[] arr = (String[])invocable.invokeMethod(
                Java, "to", obj, "java.lang.String[]");
            // access String array
            for (String s : arr) { System.out.println(s); }
        }
    }
    

    【讨论】:

      【解决方案3】:

      invokeFunction 返回JSObject [jdk.nashorn.api.scripting.JSObject] 的实例

      您可以将响应分配给 JSObject,然后遍历这些值 -

      JSObject jsObject = null;
      try {
          jsObject = (JSObject) invocable.invokeFunction("fun1");
          for (Object object : jsObject.values()) {
              System.out.println(object);
          }
      } catch (NoSuchMethodException e) {
          ...
      }
      

      【讨论】:

      • 确保JSObject 的导入是jdk.nashorn.api.scripting.JSObject
      【解决方案4】:

      我曾尝试单独在 java 中重新创建场景并且能够打印内容。

      public class test {
          public static void main(String[] args) {
              String[] a = {"This","is","from","js"};
              Object obj = (Object) a;
              String stringArray = Arrays.deepToString((Object[]) obj);
              System.out.println(stringArray);
              String [] b =  stringArray.replaceAll("[\\[\\]]", "").split(",");
              System.out.println(b[0]);   
          }
      }
      

      【讨论】:

      • 但是在这种情况下它给出了这个错误——java.lang.ClassCastException: jdk.nashorn.api.scripting.ScriptObjectMirror 不能被强制转换为 [Ljava.lang.Object;
      【解决方案5】:

      您将在 Java 中获得的输出将采用 JsonArray 格式。因此,您可以在 jsonArray 中传递您的输入内容并遍历该 JsonArray。

      您可以使用 jettison-1.3.jar 作为 JSONAray 库。

      您可以尝试以下方法。

      String[] outputStr = new String[jsonArray.length()];
      try {
          JSONArray jsonArray = new JSONArray(invocable.invokeFunction("fun1"));
          for (int i = 0; i < jsonArray.length(); i++) {
              outputStr[i] = jsonArray.getString(i);
          }
      } catch(JSONException ex) {
          ex.printStackTrace();
      }
      

      对于使用org.json.simple.JSONArray导入,可以使用如下代码

          String[] outputStr = new String[jsonArray.length()];
          try{
              JSONParser parser = new JSONParser();
              JSONArray jsonArray = (JSONArray) parser.parse(invocable.invokeFunction("fun1");
      
              for (int i = 0; i < jsonArray.size(); i++) {
                  outputStr[i] = (String) jsonArray.get(i);
              }
          } catch(JSONException ex) {
              ex.printStackTrace();
          }
      

      【讨论】:

      • 我可以直接在java程序中使用这个代码吗?我用jettison-1.3.jar尝试过,但它给出了错误。我导入以下--import org.json.simple.JSONObject;导入 org.json.simple.JSONArray;
      • 使用 jettison jar,您的导入将是 org.codehaus.jettison.json.JSONArray。是的,您可以直接在 Java 程序中使用此代码
      • 使用 jettison.jar 时出现此错误 - 没有为 JSONArray(Object) 构造函数找到合适的构造函数 JSONArray.JSONArray(JSONTokener) 不适用(参数不匹配;对象无法转换为 JSONTokener)和 3更像这样……
      • 在使用第二个代码时,我得到了以下 2 个错误,找不到适合 parse(Object) JSONArray jsonArray = (JSONArray) parser.parse(invocable.invokeFunction("fun1")) 的方法;方法 JSONParser.parse(String) 不适用(参数不匹配;对象无法转换为字符串)错误:找不到符号方法 length()
      • 感谢您的努力女士我得到了答案。
      猜你喜欢
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多