我正在使用Ant的脚本语言=" javascript"'标记在JDK 1.7上使用Rhino Js运行javascript。我最近遇到一个问题,当从函数返回时,我的变量类型被错误地更改。
我有一个非常小的辅助函数,它使用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的文件时,变量的返回类型从" string" to" 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&#34 ;失败。
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正确保存变量类型有任何想法,我真的很感激帮助。
答案 0 :(得分:1)
我能够通过在全局字符串构造函数中包装函数调用来强制执行字符串类型。
var manifestText = String(readFile(dir, filename));
我仍然不喜欢这里发生的隐式类型转换,但这至少解决了我的问题。