【问题标题】:Retrieve javascript object in java with rhino使用 rhino 在 java 中检索 javascript 对象
【发布时间】:2020-05-15 00:16:55
【问题描述】:

我想从一个 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 格式获取(类似于 cars.stringify() ),该函数会是什么样子呢?更重要的是,使用此功能的正确方法是什么? 最后,我如何以及在哪里将对象保存在 java 对象中?

我已经检查了 this postthis post 以及 this 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”包含我的cars.js?不知何故必须有可能将该对象加载到此变量中

大概是这样的:

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

但是我如何/以及在哪里指定使用此功能的文件?

【问题讨论】:

  • 一种方法是从您的 javascript 文件中调用 java 代码。例如,在 javascript 函数中执行函数 fetchCar(),并让 fetchCar() 调用 java 中的 setter 来设置值。你会将你的java类importPackage到脚本中。 (我知道不干净)
  • 但是我做了一点研究,也许这个答案就是你需要的:stackoverflow.com/a/18564532/4425643
  • @CausingUnderflowsEverywhere 感谢您的研究!我知道我错过了什么。我已经检查过那个帖子,理论上这是我正在寻找的东西,但我错过了它如何工作的代码示例。因为目前我并不真正了解它应该如何工作。大多数情况下,我希望拥有 Java 中的所有代码,而不必编写额外的 javascript 文件。
  • 还有一个问题,您使用 rhino 而不是名为 nashorn 的新脚本引擎是否有原因?
  • 我似乎找到了如何使用nashorn,提出问题的人在他的主要方法中有一些简单的代码。 stackoverflow.com/questions/28470828/… 它只需要 javascript 中的 getter 函数。

标签: javascript java json rhino


【解决方案1】:

我找到了一种使用 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 对象。 无需使用函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多