json 在java中使用rhino实现JavaScript对象

20jt8wwn  于 2023-11-20  发布在  Java
关注(0)|答案(3)|浏览(100)

我想从一个javascript文件中获取一个JavaScript对象,它只包含一个大对象。例如:

var cars = {
   mercedes: {
      colour: 'silver',
      drivemode: 'alldrive' 
   },

   audi: {
      size: '4x2x1,5m'
      speed: '220 kmph'
   }
};

字符串
对于javapart,我使用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);


但是,JavaScript函数将该对象作为JSON(类似于汽车.stringify())来获取会是什么样子?更进一步,使用此函数的正确方法是什么?最后,如何以及在何处将对象保存在Java Object中?
我已经检查了这篇文章和this postthis post,但都不符合我的标准或错过了一个代码示例澄清
编辑:我发现了另一种在java中以字符串形式调用/编写JavaScript函数的方法,如:

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”包含我的汽车.js?
大概是这样的:

String functionAsString2 = "get cars() {return this.cars;}";


但是如何/在哪里指定使用此函数的文件?

yhxst69z

yhxst69z1#

我已经找到了一种方法来检索对象使用脚本引擎从Rhino

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 Object的java Object。不需要使用函数

yx2lnoni

yx2lnoni2#

在我这边,
allClasses是我的对象classHeader total中的另一个对象是key
allClasses[classHeader]'total']

g52tjvyc

g52tjvyc3#

这应该工作,根据文档

Context context = context.enter();
context.setOptimizationLevel(9);
context.setLangaugeVersion(200);
context.getWrapFactory().setJavaPrimitiveWrap(false);

Scriptable defaultScope = context.initSafeStandardObjects();

String jsCode = """
var cars = {
   mercedes: {
      colour: 'silver',
      drivemode: 'alldrive' 
   },

   audi: {
      size: '4x2x1,5m'
      speed: '220 kmph'
   }
};
"""

context.evaluateString(defaultScope, jsCode, "<cmd">, 1, null);
Object x = scope.get("cars", defaultScope);

字符串

相关问题