Попытка проанализировать вложенный файл JSON в сценариях After Effects

#javascript #json #parsing #adobe #after-effects

#javascript #json #синтаксический анализ #adobe #after-effects

Вопрос:

может кто-нибудь показать мне, что я здесь делаю не так? У меня есть файл json, который я анализирую с помощью скрипта в After Effects, и я не уверен, как выполнить итерацию по разделу файла json.

Мой файл json:

 {
    "Timestamp": "20-Sep-2020 12:38:07.177",
    "m11": 0.2202,
    "m12": 0.8858,
    "m13": 0.4085,
    "m21": -0.9708,
    "m22": 0.2399,
    "m23": 0.0031,
    "m31": -0.0952,
    "m32": -0.3972,
    "m33": 0.9128,
    "qX": -0.13,
    "qY": 0.1635,
    "qZ": -0.6026,
    "qW": -0.7702
  },
  {
    "Timestamp": "20-Sep-2020 12:38:07.186",
    "m11": 0.2204,
    "m12": 0.8861,
    "m13": 0.4078,
    "m21": -0.9708,
    "m22": 0.2401,
    "m23": 0.0031,
    "m31": -0.0952,
    "m32": -0.3965,
    "m33": 0.9131,
    "qX": -0.1297,
    "qY": 0.1632,
    "qZ": -0.6026,
    "qW": -0.7703
  }
  

И мой файл jsx выглядит так:

 #include "json2.js"

var file = new File;
var check = 0;

var mainWindow = new Window("palette", "File Reader", undefined);
mainWindow.orientatizzaaq1on = "column";

var groupOne = mainWindow.add("group", undefined, "groupOne");
groupOne.orientation = "row";
var fileLocBox = groupOne.add("edittext", undefined, "Selected File Location");
fileLocBox.size = [150, 20];
var getFileButton = groupOne.add("button", undefined, "File...");
getFileButton.helpTip = "Select a .json file to change the comp";

var groupTwo = mainWindow.add("group", undefined, "groupTwo");
groupTwo.orientation = "row";
var applyButton = groupTwo.add("button", undefined, "Apply");

mainWindow.center();
mainWindow.show();

getFileButton.onClick = function() {
    file = file.openDlg("Open a file", "Acceptable Files:*.json");
    fileLocBox.text = file.fsName;
    check = 1;
    }

applyButton.onClick = function() {
        if(check == 0) {
                alert("Please select a file");
                return false;
            } else {
                //app.beginUndoGroup("Comp Changes");
                var fileExtension = fileLocBox.text;
                var fileData;
                
                if(fileExtension.substring(fileExtension.length-4, fileExtension.length) == "json") {
                    fileData = readJson();
                    
                    changeComp(fileData);
                }
            alert("done");
   }
}
function readJson() {
    var currentLine;
    var jsonStuff = [];
    file.open("r");
        while(!file.eof) {
                currentLine = file.readln();
                jsonStuff.push(currentLine);
            }
        file.close();
        jsonStuff = jsonStuff.join("");
        var parsedJson = JSON.parse(jsonStuff);
        
        return parsedJson;
    }

function changeComp(data) {
    var nullz = app.project.activeItem.layers.addNull();
    nullz.threeDLayer = true;
    nullz.name = "parent to me";
    var size = Object.keys(data).length;
    for (i = 0; i < size; i  ) {
        var temp =data[1].m11; 
        var t =i/25;
       nullz.xRotation.setValueAtTime(t, temp);
      }
  }
  

У меня такое чувство, что мой файл json, возможно, потребуется отформатировать по-другому, именно так он пришел ко мне из другого приложения.

Итак, идея в том, что он пройдет через файл json, получит значение «m11», применит его к повороту null, затем перейдет к следующему кадру, захватит следующий «m11» и так далее… В моем сценарии, если я просто скажу:

 var temp =data.m11; 
var t =i/25;
nullz.xRotation.setValueAtTime(t, temp);
  

Он работает и захватит значение первого «m11» и применит его к нулевому объекту.
Но если я попытаюсь перейти ко второму «m11», сказав

 var temp =data[1].m11;
  

или

 var temp =data.m11[1];
  

это не работает, поэтому просто пытаюсь понять, что я делаю не так?
Это способ форматирования json?
Json изначально шел с [] в конце и начале, но если оставить их, это приведет к сбою скрипта при попытке прочитать файл, удаление их заставит его немного работать, как я упоминал выше.

Или это скрипт? Или оба, я полагаю?

Комментарии:

1. Я думаю, что это может быть проблемой с тем, как вы читаете файл json. Это stackabuse.com/reading-and-writing-json-files-with-node-js может быть полезным

2. спасибо за это, хотя я не уверен, что это что-то добавляет — приведенный ими пример — это то, что я уже могу выполнить, прочитав из первого набора {}, у них нет второго набора {} или объясните, как вы бы нацелились на второй набор.

Ответ №1:

Я не могу воссоздать вашу точную среду, но, похоже, вы удалили скобки [], которые заставили бы json содержать массив. Если бы вы проанализировали его как массив, это сработало бы:

 function changeComp(data) {
    var nullz = app.project.activeItem.layers.addNull();
    nullz.threeDLayer = true;
    nullz.name = "parent to me";

    for (i = 0; i < data.length; i  ) {
        const value = data[i].m11;
        const time = i / 25;
        nullz.xRotation.setValueAtTime(time, value);
   }
}
  

Также не могли бы вы подробнее рассказать о своей проблеме?
Когда вы пишете:

«Но если я попытаюсь перейти ко второму «m11″, сказав (…), это не сработает»

Что не работает? Каков был код ошибки? Чтение того, что компьютер считает неправильным, обычно может помочь в поиске того, что не так!

Это файл, который я проанализировал как данные:

 [
    {
        "Timestamp": "20-Sep-2020 12:38:07.177",
        "m11": 0.2202,
        "m12": 0.8858,
        "m13": 0.4085,
        "m21": -0.9708,
        "m22": 0.2399,
        "m23": 0.0031,
        "m31": -0.0952,
        "m32": -0.3972,
        "m33": 0.9128,
        "qX": -0.13,
        "qY": 0.1635,
        "qZ": -0.6026,
        "qW": -0.7702
    },
    {
        "Timestamp": "20-Sep-2020 12:38:07.186",
        "m11": 0.2204,
        "m12": 0.8861,
        "m13": 0.4078,
        "m21": -0.9708,
        "m22": 0.2401,
        "m23": 0.0031,
        "m31": -0.0952,
        "m32": -0.3965,
        "m33": 0.9131,
        "qX": -0.1297,
        "qY": 0.1632,
        "qZ": -0.6026,
        "qW": -0.7703
    }
]
  

Комментарии:

1. Я не уверен, где искать код ошибки? Где в After Effects находится консоль? Он просто не завершит сценарий, он не добавит данные в ротацию, как предполагалось, и не выдаст всплывающее предупреждение с надписью «готово». Я почти уверен, что пробовал это с помощью [], но data[i].m11 не сработал .. вы говорите, что считаете, что так и должно быть, строка написана правильно? Я не был уверен, что добавление [i] к «данным» было правильным способом его достижения.

2. @BrianWilliams Да, если бы вы проанализировали json с помощью массива, он работал бы с кодом, который я опубликовал, я протестировал его. Если в AE нет кодов ошибок, вы можете записать данные в way, чтобы вы могли видеть, что делает программа. Добавление Alert( JSON.stringify(data) ) после синтаксического анализа ваших данных позволит вам увидеть, как ваша программа проанализировала файл json.