Почему объявление простого объекта JSON в сценарий JavaScript, выполняемый в Rhino, не работает?
Я не очень в JavaScript. Я использую JavaScript для разработки небольшого скрипта, работающего над документом JSON. Этот сценарий JavaScript не выполняется в браузере, но является другим продуктом, который позволяет использовать JavaScript для сценариев некоторых задач (prodcut - WSO2 ESB, но в настоящее время это не важно).
Этот продукт (WSO2 ESB) использует Rhino в качестве движка JavaScript, используемого для реализации сценариев JavaScript в приложении Java.
У меня возникла проблема при попытке создать простой объект JSON в такой среде.
Я сделал что-то вроде этого (в мой код WSO2 ESB):
<script language="js">
<![CDATA[
var response = JSON.parse(`
{
"forecast": []
}
`);
]]>
</script>
Используя тот же код в классическом файле JavaScript, выполняемом в браузере, он отлично работает, но кажется, что он не может работать с Rhino. Я получаю ошибку, связанную с недопустимым символом (я также попытался заменить ` и` на ' и ' и на ' и ', но я все еще получаю ошибку).
Примерно так в Java Stacktrace:
Caused by: javax.script.ScriptException: org.mozilla.javascript.EvaluatorException: illegal character (<Unknown Source>#9)
at com.sun.phobos.script.javascript.RhinoScriptEngine.compile(RhinoScriptEngine.java:341)
at com.sun.phobos.script.javascript.RhinoScriptEngine.compile(RhinoScriptEngine.java:323)
at org.apache.synapse.mediators.bsf.ScriptMediator.initInlineScript(ScriptMediator.java:399)
... 32 more
В чем может быть проблема с Rhino? Я думаю, что проблема может быть связана с `` характером, который, возможно, нужно каким-то образом избежать. Какая-то идея?
Или другое, более чистое решение для обхода JavaScript может быть следующим: возможно ли объявить объект JSON следующим образом:
{
"forecast": []
}
по-другому? Я имею в виду программным способом без явного объявления этого.
1 ответ
Это работает в современных браузерах, которые поддерживают ES6 с литералами шаблонов:
var response = JSON.parse(`{"forecast": []}`);
Почему, потому что JavaScript сначала решает обратные тики в качестве шаблона и заполняет их содержимым переменных до разбора строки JSON:
var test = "Cloudy";
var string = `{\"forecast": ["${test}"]}`;
var response = JSON.parse(string);
console.log(response);
Но, возможно, ваша сборка Rhino не имеет поддержки ES6, так что это не сработает. Также мультилинии вызывает проблемы:
var response = JSON.parse(''+
'{'+
' "forecast": []'+
'}'
);
console.log(response);