#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.