我正在为After Effects编写一个面板,我正在尝试将一个Object从我的main.js发送到我的jsx文件。从我可以找到的样本中,他们说我不能发送一个对象,但必须使用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) + '"")' );
myFunctions.jsx
$._ext_SB={
batch : function(profileUI) {
var str = "";
for (prop in profileUI) {
str += prop + " [" + typeof profileUI[prop] + "]: " + profileUI[prop] + ".\n";
}
alert(str);
},
};
我收到错误:无法在第1行运行脚本。预计:)
它似乎没有得到一个实际的字符串,就像我上面提到的那样,尝试传递一个对象也不起作用(这将是更好的选择)。
答案 0 :(得分:1)
在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 生成的双引号。
可能导致问题的字符串还可能包含除双引号之外的其他特殊字符。
答案 1 :(得分:0)
这里有三个问题。参见:
您对"
的通话中有一个额外的双引号(evalScript
)字符。这样:
csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '"")' );
应该是这个(请注意删除两个最终"
个字符之一):
csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '")' );
正如您指出in another answer,您需要转义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 = "";
// ...
}
}
一些注意事项:
JSON.parse()
返回的对象将是一个简单的对象 - 它将包含与您调用的对象JSON.stringify()
相同的属性,但它不具有任何关联的功能。答案 2 :(得分:0)
这行代码......
csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '")' );
需要改为:
csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI).replace(/"/g,'\\"') + '")' );
JSON.stringify创建一个有效的字符串但是当我尝试通过'"'+someString+'"'
创建字符串的源代码时,这只有在someString本身不包含任何引号时才有效。 replace()用\“替换所有引号,以便它可以作为有效字符串发送。