【发布时间】:2018-02-20 16:51:49
【问题描述】:
我正在为前端的 javascript 和后端的 java 做一个项目。我正在使用 JSONata 在前端解析传入的 json(这很棒)。它适用于除 Internet Explorer 之外的所有浏览器。
代码基本上是(我使用 JSONata 的地方):
$.ajax({
dataType: 'json',
cache : false,
type: "POST",
url: "consult",
data: {"id": id},
success: function(data) {
console.log("data", data);
var claim = jsonata('$[0].data.claim').evaluate(data);
}
这在所有浏览器中都没有问题,除了我收到以下错误的 Internet Explorer:
SCRIPT5009: 'jsonata' is undefined
JSONata 不适合 Internet Explorer 吗?还是有办法绕过这个?
另外,我想好了,如果我不能在客户端运行它,我会在服务器上运行 JSONata,所以我尝试了这段代码:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("JavaScript");
Invocable inv = (Invocable) engine;
FileReader jsonata = new FileReader("jsonata.js");
engine.eval(jsonata);
// read and JSON.parse the input data
byte[] sample = Files.readAllBytes(Paths.get("sample.json"));
engine.put("input", new String(sample));
Object inputjson = engine.eval("JSON.parse(input);");
// query the data
String expression = "$sum(Account.Order.Product.(Price * Quantity))"; // JSONata expression
Object expr = inv.invokeFunction("jsonata", expression);
Object resultjson = inv.invokeMethod(expr, "evaluate", inputjson);
// JSON.stringify the result
engine.put("resultjson", resultjson);
Object result = engine.eval("JSON.stringify(resultjson);");
System.out.println(result);
我收到以下错误:
Exception in thread "main" javax.script.ScriptException: <eval>:1448:25 Expected an operand but found yield
result = yield evaluatePath(expr.steps, input, environment);
^ in <eval> at line number 1448 at column number 25
at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
at jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:537)
at jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:524)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:402)
at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:150)
at javax.script.AbstractScriptEngine.eval(Unknown Source)
at com.test.main.Main.main(Main.java:67)
Caused by: jdk.nashorn.internal.runtime.ParserException: <eval>:1448:25 Expected an operand but found yield
result = yield evaluatePath(expr.steps, input, environment);
^
at jdk.nashorn.internal.parser.AbstractParser.error(AbstractParser.java:294)
at jdk.nashorn.internal.parser.AbstractParser.error(AbstractParser.java:279)
at jdk.nashorn.internal.parser.Parser.unaryExpression(Parser.java:3182)
at jdk.nashorn.internal.parser.Parser.expression(Parser.java:3325)
at jdk.nashorn.internal.parser.Parser.expression(Parser.java:3282)
at jdk.nashorn.internal.parser.Parser.expressionStatement(Parser.java:1150)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:967)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:863)
at jdk.nashorn.internal.parser.Parser.statementList(Parser.java:1013)
at jdk.nashorn.internal.parser.Parser.getBlock(Parser.java:531)
at jdk.nashorn.internal.parser.Parser.switchStatement(Parser.java:1717)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:917)
at jdk.nashorn.internal.parser.Parser.sourceElements(Parser.java:773)
at jdk.nashorn.internal.parser.Parser.functionBody(Parser.java:2901)
at jdk.nashorn.internal.parser.Parser.functionExpression(Parser.java:2663)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:875)
at jdk.nashorn.internal.parser.Parser.sourceElements(Parser.java:773)
at jdk.nashorn.internal.parser.Parser.functionBody(Parser.java:2901)
at jdk.nashorn.internal.parser.Parser.functionExpression(Parser.java:2663)
at jdk.nashorn.internal.parser.Parser.memberExpression(Parser.java:2506)
at jdk.nashorn.internal.parser.Parser.leftHandSideExpression(Parser.java:2372)
at jdk.nashorn.internal.parser.Parser.unaryExpression(Parser.java:3147)
at jdk.nashorn.internal.parser.Parser.expression(Parser.java:3282)
at jdk.nashorn.internal.parser.Parser.primaryExpression(Parser.java:1992)
at jdk.nashorn.internal.parser.Parser.memberExpression(Parser.java:2511)
at jdk.nashorn.internal.parser.Parser.leftHandSideExpression(Parser.java:2372)
at jdk.nashorn.internal.parser.Parser.unaryExpression(Parser.java:3147)
at jdk.nashorn.internal.parser.Parser.assignmentExpression(Parser.java:3353)
at jdk.nashorn.internal.parser.Parser.variableStatement(Parser.java:1088)
at jdk.nashorn.internal.parser.Parser.statement(Parser.java:884)
at jdk.nashorn.internal.parser.Parser.sourceElements(Parser.java:773)
at jdk.nashorn.internal.parser.Parser.program(Parser.java:709)
at jdk.nashorn.internal.parser.Parser.parse(Parser.java:283)
at jdk.nashorn.internal.parser.Parser.parse(Parser.java:249)
at jdk.nashorn.internal.runtime.Context.compile(Context.java:1284)
at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:1251)
at jdk.nashorn.internal.runtime.Context.compileScript(Context.java:627)
at jdk.nashorn.api.scripting.NashornScriptEngine.compileImpl(NashornScriptEngine.java:535)
... 5 more
PD:我正在使用 jsonata.js(来自他们的网站:https://github.com/jsonata-js/jsonata/blob/master/jsonata.js"
如何运行 JSONata 以便它在所有浏览器中兼容(特别是在 Internet Explorer 中)
非常感谢!
【问题讨论】:
-
jsonata未定义的事实意味着从 github 加载 jsonata 库时出现问题(或者花费了太长时间)。如果您打开开发控制台 (F12) 并重新加载页面 (F5),控制台中是否有任何错误,或者“网络”选项卡上有一些 http 错误? -
这是控制台中出现的错误:SCRIPT5009: 'jsonata' is undefined。另外,我直接将 jsonata.js 作为文件输入,我没有从 github 读取它。
-
好吧,我以为你是在说你从 github 站点加载了库......无论如何,你能展示一下 如何 你正在加载
jsonata.js的本地副本吗?文件? -
我把这一行放在一个“.jsp”文件中:。该项目在除 Internet Explorer 之外的所有浏览器中都运行良好。我不知道为什么它在 Internet Explorer 中不起作用,它不兼容吗?
-
这取决于脚本放置在页面中的何处。这听起来像是一个时间问题——IE 试图在它完全加载之前使用
jsonata库。您是否在浏览器的开发控制台中验证了相对路径“js/jsonata.js”实际上是通过该 url 正确加载库(没有 404 或 500 错误)?我见过 IE 用相对 url 和代理做了一些奇怪的事情......
标签: javascript java internet-explorer jsonata