ExtendScript中JSON.stringify替代方案及对象内容显示问题
解决ExtendScript中JSON.stringify报错及对象内容显示问题
首先,你遇到的"can't execute script in target engine"错误,主要是因为ExtendScript环境下的原生JSON.stringify对脚本引擎内的对象支持有限,尤其是和InDesign DOM或XMP相关的对象属性容易触发兼容性问题。下面给你两个可行的解决方案:
方案1:使用ExtendScript内置的$.stringify
Adobe为ExtendScript提供了专门的序列化方法$.stringify,它比原生JSON.stringify更适配InDesign的脚本环境,能避免很多引擎执行错误。
直接修改你的代码,把JSON.stringify替换成$.stringify即可:
for (var i = 0, len = doc.links.length; i < len; i++) { var linkFilepath = File(doc.links[i].filePath).fsName; var linkFileName = doc.links[i].name; var xmpFile = new XMPFile(linkFilepath, XMPConst.FILE_INDESIGN, XMPConst.OPEN_FOR_READ); var allXMP = xmpFile.getXMP(); // Retrieve values from external links XMP. var documentID = allXMP.getProperty(XMPConst.NS_XMP_MM, 'DocumentID', XMPConst.STRING); var instanceID = allXMP.getProperty(XMPConst.NS_XMP_MM, 'InstanceID', XMPConst.STRING); linksInfObj[linkFileName] = {'docId': documentID, 'insId': instanceID}; // 替换为ExtendScript内置的序列化方法 linkObjStr = $.stringify(linksInfObj); // 用自定义函数显示对象内容,替代默认的[object Object] alert('Object: ' + printObj(linksInfObj), true); alert('String: ' + linkObjStr, true); }
方案2:自定义对象转字符串函数
如果$.stringify还是有问题,你可以自己写一个递归函数来遍历对象的键值对,生成可读的字符串,解决alert显示[object Object]的问题:
function printObj(obj) { var str = ''; for (var key in obj) { if (obj.hasOwnProperty(key)) { var val = obj[key]; // 如果值是对象,递归处理 if (typeof val === 'object' && val !== null) { str += key + ': {' + printObj(val) + '}, '; } else { // 基本类型直接拼接 str += key + ': "' + val + '", '; } } } // 移除末尾多余的逗号和空格 return str.slice(0, -2); }
然后在alert里调用这个函数:alert('Object: ' + printObj(linksInfObj), true);,就能看到对象的具体键值内容了。
额外说明
- 为什么原生
JSON.stringify会报错?ExtendScript的原生JSON实现并不是完全标准的,当处理包含脚本引擎特有对象(比如XMP对象的引用残留,或者InDesign DOM相关的隐式属性)时,容易触发引擎执行异常。而$.stringify是Adobe针对ExtendScript优化过的,能更好地处理这类场景。 - 如果你只是想调试查看对象内容,也可以使用ExtendScript的
$.writeln()方法,把内容输出到脚本编辑器的控制台(比如Adobe ExtendScript Toolkit的Console面板),比alert更方便查看长内容。
内容的提问来源于stack exchange,提问作者Madasu K
相关产品推荐
相关产品推荐

