如何在 java(数组中)中获取 javascript 数组输出?
How can I get javascript array output in java (in array)?
我有一个java脚本文件fun.js
function fun1(){
var arr =['This','is','from','js'];
return arr;
}
我想在 java 数组中获取这个数组,所以我使用 nashorn 作为-
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 数组?
invokeFunction
returns 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]);
}
}
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" 的方法在 Java 脚本和 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); }
}
}
我有一个java脚本文件fun.js
function fun1(){
var arr =['This','is','from','js'];
return arr;
}
我想在 java 数组中获取这个数组,所以我使用 nashorn 作为-
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 数组?
invokeFunction
returns 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]);
}
}
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" 的方法在 Java 脚本和 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); }
}
}