Rhino JS 在函数 return 期间错误地将 JSON 字符串转换为对象

Rhino JS incorrectly converting JSON string to object during function return

我在 JDK 1.7 上将 Ant 的 'script language="javascript"' 标记用于 运行 javaRhino Js 脚本。我最近遇到一个问题,当我的变量的类型从函数 returned 时被错误地更改。

我有一个非常小的辅助函数,它使用 java 接口读取文件。

        importClass(java.io.File);
        importClass(java.io.FileReader);
        function readFile(directory, filename) {
            var file = new File(directory, filename);
            println("Found file: " + directory + "/" + filename);
            var fr = new FileReader(file);
            var fileText = "";
            var nextChar = fr.read();
            while(nextChar != -1)
            {
                fileText += String.fromCharCode(nextChar);
                nextChar = fr.read();
            }
            println('In readFile result has type ' + typeof fileText);
            return fileText;
        }

这在大多数机器上工作正常,但是在 linux 框的某些子集上,当此函数用于读取包含有效 JSON、return 类型的文件时变量从 "string" 更改为 "object".

// manifest.json is a file containing valid JSON.
var manifestText = readFile(extensionDirectory, "manifest.json");
println('After return result has type ' + typeof manifestText);
// The output of the above is:
// [script] In readFile result has type string
// [script] After return result has type object

通常我会把它归结为一个奇怪的现象,只是检查类型并将对象转换回带有 JSON.stringify 的字符串,但是...尝试在新 JSON.stringify 上调用 JSON.stringify =27=] 失败。

javax.script.ScriptException: sun.org.mozilla.javascript.EvaluatorException: Java class "[Ljava.lang.annotation.Annotation;" has no public instance field or method named "toJSON". (<Unknown source>#18) in <Unknown source> at line number 18

如果有人对如何强制 Rhino JS 通过函数调用正确保留变量类型有任何想法,我将不胜感激。

我能够通过将函数调用包装在全局字符串构造函数中来强制使用字符串类型。

var manifestText = String(readFile(dir, filename));

我仍然不喜欢这里发生的隐式类型转换,但这至少解决了我的问题。