使用 rhino 在 java 中检索 javascript 对象
Retrieve javascript object in java with rhino
我想从 java 脚本文件中获取一个 java 脚本对象,它只包含一个大对象。
例如:
var cars = {
mercedes: {
colour: 'silver',
drivemode: 'alldrive'
},
audi: {
size: '4x2x1,5m'
speed: '220 kmph'
}
};
对于 java 部分,我使用 rhino 来获取该对象。现在我已经编码:
Context context = context.enter();
context.setOptimizationLevel(9);
context.setLangaugeVersion(170);
context.getWrapFactory().setJavaPrimitiveWrap(false);
Scriptable defaultScope = context.initSafeStandardObjects();
所以现在我应该有可能检索 javascript 对象。但是怎么办?
Script function = context.compileString("Any javascriptfunction as String", "javaScriptFile.js", 1, null);
function.exec(context, defaultScope);
但是那个 java 脚本函数看起来像什么来获得对象 JSON (类似于 cars.stringify() )?更重要的是,使用此功能的正确方法是什么?
最后,如何以及在何处将对象保存在 java 对象中?
我已经检查过 this post and this post also this post 但所有都不符合我的标准或缺少代码示例以供澄清
编辑:
我在 calling/writing 中找到了另一种方法 java 中的脚本函数 java 作为字符串,如:
Scriptable scriptObject;
private String functionAsString = "function getAsJson() {var objectString = { colour: \"silver\", drivemode: \"alldrive\" };return JSON.stringify(objectString);}";
Function fct = context.compileFunction(defaultScope, functionAsString, "AnyName", 1, null);
Object result = fct.call(context, defaultScope, scriptObject, null);
唯一仍然存在的问题是如何让 "objectString" 包含我的 cars.js?必须以某种方式在这个变量中加载该对象
可能是这样的:
String functionAsString2 = "get cars() {return this.cars;}";
但是how/and我在哪里指定使用这个函数的文件?
我找到了使用 Rhino 的 ScriptEngine 检索对象的方法
private ScriptEngineManager manager = new ScriptEngineManager();
private ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(Files.newBufferReader("PATH TO THE JAVASCRIPT FILE", StandardCharsets.UTF_8));
Object result = engine.get("cars"); //Variable in the javascript File
if(result instanceof Map){
result = (Map<String,Object>) result;
}
所以对象被检索并且可以被访问并转换为 Map> 并递归访问到最终具有 JavaScript 对象的 java 对象。
无需使用函数
我想从 java 脚本文件中获取一个 java 脚本对象,它只包含一个大对象。 例如:
var cars = {
mercedes: {
colour: 'silver',
drivemode: 'alldrive'
},
audi: {
size: '4x2x1,5m'
speed: '220 kmph'
}
};
对于 java 部分,我使用 rhino 来获取该对象。现在我已经编码:
Context context = context.enter();
context.setOptimizationLevel(9);
context.setLangaugeVersion(170);
context.getWrapFactory().setJavaPrimitiveWrap(false);
Scriptable defaultScope = context.initSafeStandardObjects();
所以现在我应该有可能检索 javascript 对象。但是怎么办?
Script function = context.compileString("Any javascriptfunction as String", "javaScriptFile.js", 1, null);
function.exec(context, defaultScope);
但是那个 java 脚本函数看起来像什么来获得对象 JSON (类似于 cars.stringify() )?更重要的是,使用此功能的正确方法是什么? 最后,如何以及在何处将对象保存在 java 对象中?
我已经检查过 this post and this post also this post 但所有都不符合我的标准或缺少代码示例以供澄清
编辑: 我在 calling/writing 中找到了另一种方法 java 中的脚本函数 java 作为字符串,如:
Scriptable scriptObject;
private String functionAsString = "function getAsJson() {var objectString = { colour: \"silver\", drivemode: \"alldrive\" };return JSON.stringify(objectString);}";
Function fct = context.compileFunction(defaultScope, functionAsString, "AnyName", 1, null);
Object result = fct.call(context, defaultScope, scriptObject, null);
唯一仍然存在的问题是如何让 "objectString" 包含我的 cars.js?必须以某种方式在这个变量中加载该对象
可能是这样的:
String functionAsString2 = "get cars() {return this.cars;}";
但是how/and我在哪里指定使用这个函数的文件?
我找到了使用 Rhino 的 ScriptEngine 检索对象的方法
private ScriptEngineManager manager = new ScriptEngineManager();
private ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval(Files.newBufferReader("PATH TO THE JAVASCRIPT FILE", StandardCharsets.UTF_8));
Object result = engine.get("cars"); //Variable in the javascript File
if(result instanceof Map){
result = (Map<String,Object>) result;
}
所以对象被检索并且可以被访问并转换为 Map> 并递归访问到最终具有 JavaScript 对象的 java 对象。 无需使用函数