我正在使用javax.script.ScriptEngine从java程序调用js方法。
在js方法中,我使用" f"构建以下json。具有数组值的键,我将在json之后返回此内容...
{"s":0,"q":{"b":{"f":[{"r":{"cr":{"gte":"2012-04-01","lte":"2016-07-11","format":"yyyy-MM-dd"}}},{"t":{"x":"kl"}},{"t":{"e":"io"}}]}},"a":{"c":{"t":{"f":"x"}}}}
在java中,我看到相同的json数组被扭曲为" 0"," 1"和" 2"键。请看" f"价值在这里...
{"s":0,"q":{"b":{"f":{"0":{"r":{"cr":{"gte":"2012-04-01","lte":"2016-07-11","format":"yyyy-MM-dd"}}},"1":{"t":{"x":"kl"}},"2":{"t":{"e":"io"}}}}},"a":{"c":{"t":{"f":"x"}}}}
这是java代码......
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
scriptEngine.eval(Files.newBufferedReader(Paths.get("some.js"), StandardCharsets.UTF_8));
Invocable inv = (Invocable) scriptEngine;
Object result = inv.invokeFunction("someFunc", "someparam");
你能不能给我一个暗示,为什么它会被扭曲?
以下代码可以显示我的案例...
Javascript函数 - some.js
function someFunc() {
var result = {};
result["q"] = "0";
var f = [];
f.push("a");
f.push("b");
f.push("c");
result["f"] = f;
print(JSON.stringify(result));
return result;
}
Java类
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
public class SomeClass {
public static void main(String[] args) throws Exception {
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
scriptEngine.eval(Files.newBufferedReader(Paths.get("some.js"), StandardCharsets.UTF_8));
Invocable inv = (Invocable) scriptEngine;
Object result = inv.invokeFunction("someFunc");
ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.writeValueAsString(result));
}
}
输出
JS log: {"q":"0","f":["a","b","c"]}
java log: {"q":"0","f":{"0":"a","1":"b","2":"c"}}