Почему объявление простого объекта 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);

Другие вопросы по тегам