Photoshop 2015 扩展无法访问所有数组项

Photoshop 2015 extension not able to access all array items

我是一名新手程序员,也是 adobe 扩展的新手,但我开发的扩展在 Photoshop 2015 中无法正常工作。它在 PS 2017、2018 和 2019 中完美运行。

我正在使用 JSX 从 JSON 文件中读取数组数据,并使用 main.js 文件中的事件侦听器来 return 数据。该扩展程序从 returned 数组中读取设置。除了在 PS 2015 年它只能 return UserID 而没有别的以外,它工作得很好。

JSX 代码从本地文件读取数据:

function ReadUserStoredDataFromFile(vfilepath){      
    var rd = ReadFileData(vfilepath);     
    SendDataToListenerJS("getuserstoredinfo",rd);    
}

function ReadFileData(vfullpath){    
    fle = File(vfullpath); 
    var filedata = 0;

    if(fle.exists){    
        fle.open('r');
        filedata = fle.read();
        fle.close();
    }

    return filedata;
}

function SendDataToListenerJS(JSlistenerName,DatatoJS){
    try {
        var xLib = new ExternalObject("lib:\PlugPlugExternalObject");
    } catch (e) {
        alert(e);
    }

    if (xLib) {
        var eventObj = new CSXSEvent(); 
        eventObj.type = JSlistenerName;
        eventObj.data = DatatoJS;
        eventObj.dispatch();
    }
}

INDEX.HTML

var datareceived_arry = new Array();

MAIN.JS代码

var usermydocuments = csInterface.getSystemPath(SystemPath.MY_DOCUMENTS);

setTimeout(AutoStatus, 1000);  

function AutoStatus(){
    var usdocfp = '"' + usermydocuments + '/rt/autostatus.json' + '"';
    csInterface.evalScript('ReadUserStoredDataFromFile('+ usdocfp +')');
}

csInterface.addEventListener("getuserstoredinfo", function(evt) {              
    datareceived_arry = evt.data;              
    var unoti = GetAllNotifications();                        
});

function GetAllNotifications(){          
            //get user notification
            var allunotifications = "none";

            //add userid
            allunotifications = "<b>Userid: " + datareceived_arry['userinfo']['userid'] + "</b>";

            alert(datareceived_arry['userinfo']['userid']); //This shows the userid Fari
            alert(JSON.stringify(datareceived_arry['apps'][0]['version'])); //This shows undefined
            alert(JSON.stringify(datareceived_arry)); //This shows all the data
            $('#showdata').html(JSON.stringify(datareceived_arry)); //This shows all the data
}

这是保存到文件的数据:

{"0":0,"userinfo":{"userid":"fari","loginstatus":1,"usernotification":""},"apps":[{"appid":"rt5processor","accounttype":"Admin","status":"6","datestarted":"2019-10-11","usagedata":"1","flagcookiedata":"0","flagstorage":"0","appname":"RTPROCESSOR","version":"1.11.8","appnotification":"","apptype":"extension","updateflag":"0"},{"appid":"rt5sharpen","accounttype":"Admin","status":"6","datestarted":"2019-10-11","usagedata":"1","flagcookiedata":"0","flagstorage":"1","appname":"RTSHARPEN","version":"1.11.8","appnotification":"","apptype":"extension","updateflag":"0"}],"tutorials":[{"appid":"rtp","tutorialurl":"https://www.youtube.com/watch?v=W3cKq7S3qKc","featureonapp":"sharpen3"},{"appid":"rtp","tutorialurl":"https://www.youtube.com/watch?v=fKn5fG3M1m8","featureonapp":"Sharpen"},{"appid":"rtp","tutorialurl":"https://www.youtube.com/watch?v=m9M7J9uMrJk","featureonapp":"sharpen2"}],"misc":{"globalnotification":""}}

我使用了将被替换的虚拟测试数据。它 return 在 PS 2017、2018、2019 年都很好。它使用 cep 4,但我已经尝试过 cep 6,但问题仍然存在。任何帮助表示赞赏。

也许这背后有一个伟大的故事,但显然 CC2015 中的事件对象解析器已损坏:虽然简单的对象工作(因此您的 datareceived_arry['userinfo']['userid'] 可访问)数组被转换为字符串:JSON面板接收到的信息如下所示(注意现在所有数组都是字符串):

{
    "0": "0",
    "tutorials": "[{\"tutorialurl\":\"https://www.youtube.com/watch?v=W3cKq7S3qKc\",\"appid\":\"rtp\",\"featureonapp\":\"sharpen3\"},{\"tutorialurl\":\"https://www.youtube.com/watch?v=fKn5fG3M1m8\",\"appid\":\"rtp\",\"featureonapp\":\"Sharpen\"},{\"tutorialurl\":\"https://www.youtube.com/watch?v=m9M7J9uMrJk\",\"appid\":\"rtp\",\"featureonapp\":\"sharpen2\"}]",
    "userinfo":
    {
        "usernotification": "",
        "userid": "fari",
        "loginstatus": "1"
    },
    "apps": "[{\"version\":\"1.11.8\",\"datestarted\":\"2019-10-11\",\"appname\":\"RTPROCESSOR\",\"updateflag\":\"0\",\"flagstorage\":\"0\",\"accounttype\":\"Admin\",\"appid\":\"rt5processor\",\"status\":\"6\",\"usagedata\":\"1\",\"flagcookiedata\":\"0\",\"apptype\":\"extension\",\"appnotification\":\"\"},{\"version\":\"1.11.8\",\"datestarted\":\"2019-10-11\",\"appname\":\"RTSHARPEN\",\"updateflag\":\"0\",\"flagstorage\":\"1\",\"accounttype\":\"Admin\",\"appid\":\"rt5sharpen\",\"status\":\"6\",\"usagedata\":\"1\",\"flagcookiedata\":\"0\",\"apptype\":\"extension\",\"appnotification\":\"\"}]",
    "misc":
    {
        "globalnotification": ""
    }
}

如果你真的想要使用PlugPlugExternalObject将数据从 jsx 传递到 js 为了一些合理的我相信你必须为你的对象编写一个自定义解析器.否则我建议简单地 return 从 jsx 到 js 的数据并在回调中使用它:

JSX:

function ReadUserStoredDataFromFile(vfilepath)
{
    var rd = ReadFileData(vfilepath);
    return rd;
}

function ReadFileData(vfullpath)
{
    fle = File(vfullpath);
    var filedata = 0;

    if (fle.exists)
    {
        fle.open('r');
        filedata = fle.read();
        fle.close();
    }

    return filedata;
}

JS:

    var datareceived_arry = [];
    var usermydocuments = csInterface.getSystemPath(SystemPath.MY_DOCUMENTS);

    setTimeout(AutoStatus, 1000); 

    function AutoStatus()
    {
        var usdocfp = '"' + usermydocuments + '/rt/autostatus.json' + '"';
        csInterface.evalScript('ReadUserStoredDataFromFile(' + usdocfp + ')', function(res)
        {
            datareceived_arry = JSON.parse(res) // result comes as a string
            //get user notification
            var allunotifications = "none";

            //add userid
            allunotifications = "<b>Userid: " + datareceived_arry['userinfo']['userid'] + "</b>";

            alert(datareceived_arry['userinfo']['userid']); //This shows the userid Fari
            alert(JSON.stringify(datareceived_arry['apps'][0]['version'])); //This shows undefined
            alert(JSON.stringify(datareceived_arry)); //This shows all the data
            $('#showdata').html(JSON.stringify(datareceived_arry)); //This shows all the data
        });
    }