簡體   English   中英

我如何在Java中獲取JavaScript數組輸出(在數組中)?

[英]How can I get javascript array output in java (in array)?

我有一個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數組

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可以獲取可以添加到要使用的另一個數組的每個元素。

您可以使用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); }
    }
}

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) {
    ...
}

您將在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中重新創建場景,並且能夠打印內容。

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]);   
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM