Панель AE: отправить объект из JS в JSX

Я пишу панель для After Effects и пытаюсь отправить объект из моего main.js в мой файл jsx. Из тех образцов, которые я могу найти, они говорят, что я не могу отправить объект, но должен выполнить stringify() объект и передать его вместо этого.

Я пытался отправить как объект, так и строку объекта stringify - ни один из них не работает для меня.

main.js

var profileUI = {
     script: '',
     data: {
          csv:    $('#csv')[0].checked,
          feed:   $('#json')[0].checked,
          gs:     $('#googleSheets')[0].checked
     },
}
var csInterface = new CSInterface();
csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '"")' );

мои функции.jsx

$._ext_SB={
    batch : function(profileUI) {

        var str = "";
        for (prop in profileUI) {
          str += prop + " [" + typeof profileUI[prop] + "]: " + profileUI[prop] + ".\n";
        }
        alert(str);
    },
};

Я получаю сообщение об ошибке: невозможно запустить скрипт в строке 1. Ожидается :)

Похоже, что он не получает фактическую строку, и, как я уже упоминал выше, попытка передать объект также не работает (это было бы предпочтительнее).


person sbaden    schedule 24.05.2017    source источник


Ответы (3)


Здесь есть три проблемы. Видеть:

Синтаксическая ошибка в JavaScript

У вас есть лишний символ двойной кавычки (") в вашем вызове evalScript. Этот:

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '"")' );

должно быть так (обратите внимание на удаление одного из двух последних символов "):

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '")' );

JSON нужно экранировать

Как вы указали в другом ответе, вам нужно экранировать символы " в строке JSON, чтобы она была правильно удалена. сбежал при обработке evalScript(). Это приводит к:

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI).replace(/"/g,'\\"') + '")' );

Для ясности экранирование выполняется с помощью .replace(/"/g,'\\"').

evalScript Не выполняет автоматический анализ JSON

Вам нужно будет вызвать JSON.parse() для параметра profileUI, чтобы вернуть версию объекта. Видеть:

$._ext_SB={
    batch : function(_profileUI) {
        // Convert the input string back into an object.
        var profileUI = JSON.parse(_profileUI);

        // Everything else should work okay...
        var str = "";
        // ...
    }
}

Некоторые примечания:

  1. Объект, который вы получите от JSON.parse(), будет простым объектом — он будет содержать те же свойства, что и объект, для которого вы вызвали JSON.stringify(), но у него не будет никаких связанных функций.
  2. ExtendScript не поддерживает автоматически JSON. Если он существует в приложении, когда вы запускаете свою панель, это происходит потому, что все панели (включая созданные Adobe) используют один и тот же контекст ExtendScript. Некоторые панели Adobe уже включают библиотеку JSON, и обычно вы можете обойтись без нее. Однако, если вы не можете использовать JSON, вам нужно будет самостоятельно включить совместимую библиотеку JSON. Некоторые из них упоминаются здесь.
person Eric Robinson    schedule 25.05.2017
comment
Я исправил лишнюю цитату и добавил JSON.parse(). Я также добавил: #include /Users/sbaden/Documents/development_AE/SCRIPTS/04_COMMON/json2.jsx, но все равно получаю ту же ошибку. - person sbaden; 25.05.2017
comment
Скорректировал запись с вашим кодом! Недавно я столкнулся с той же проблемой и забыл добавить ее. Рад, что у вас получилось все уладить! - person Eric Robinson; 26.05.2017

На стороне js вы также можете использовать строки шаблона: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/template_strings

evalScript(`$._ext_SB.batch('${encodeURIComponent(JSON.stringify(profileUI))}')`);

Одинарные кавычки содержат строку для передачи ее в качестве строкового параметра функции jsx.

И encodeURIComponent экранирует все, что может содержать строка, что может вызвать проблему при отправке ее в jsx.

Затем в jsx вы меняете кодировку и строку:

var profileUI = JSON.parse(decodeURIComponent(_profileUI));

replace(/"/g,'\\"') заменяет только двойные кавычки, созданные JSON.parse.

Строка, которая может вызвать проблемы, может также содержать другие специальные символы, кроме двойных кавычек.

person Guntram    schedule 01.02.2021

Эта строка кода...

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '")' );

Необходимо изменить на:

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI).replace(/"/g,'\\"') + '")' );

JSON.stringify создает действительную строку, но когда я пытаюсь создать исходный код для строки с помощью '"'+someString+'"', это будет работать, только если сама someString не содержит кавычек. replace() заменяет все кавычки на \", чтобы его можно было отправить как допустимую строку.

person sbaden    schedule 25.05.2017