Попытка разобрать вложенный файл JSON в сценариях 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, применит его к вращению нуля, затем перейдет к следующему кадру, захватит следующий m11 и так далее... В моем сценарии, если я просто скажу :

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

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

var temp =data[1].m11;

or

var temp =data.m11[1];

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

Или это сценарий? Или оба, я полагаю?


person Brian Williams    schedule 21.09.2020    source источник
comment
Я думаю, что это может быть проблема с тем, как вы читаете файл json. Этот stackabuse.com/reading-and-writing-json- файлы-с-узлом-js могут быть полезны   -  person punitcse    schedule 21.09.2020
comment
спасибо за это, хотя я не уверен, что это что-то добавляет - пример, который они приводят, - это то, что я уже могу выполнить, читая из первого набора {}, у них нет второго набора {} или объяснить, как вы нацелились бы на второй набор.   -  person Brian Williams    schedule 21.09.2020


Ответы (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
    }
]
person Jesper Hustad    schedule 21.09.2020
comment
Я не уверен, где искать, чтобы найти код ошибки? Где в After Effects находится консоль? Он просто не завершит скрипт, не добавит данные в ротацию, как предполагалось, не выдаст всплывающее предупреждение о том, что сделано. Я почти уверен, что пробовал это с [] , но data[i].m11 не сработало ... вы говорите, что, по-вашему, это должно быть, хотя строка написана правильно? Я не был уверен, что добавление [i] к «данным» было правильным способом его достижения. - person Brian Williams; 21.09.2020
comment
@BrianWilliams Да, если вы проанализируете json с массивом, он будет работать с кодом, который я разместил, я проверил его. Если в AE нет кодов ошибок, вы можете регистрировать данные, чтобы видеть, что делает программа. Добавление Alert( JSON.stringify(data) ) после синтаксического анализа ваших данных позволит вам увидеть, как ваша программа проанализировала файл json. - person Jesper Hustad; 22.09.2020