Copy link to clipboard
Copied
I'm not a JavaScript or UXP expert, most likely I'm doing something obvious wrong here. But I haven't been able to find an answer for this anywhere.
Here's how I attempt to load the JSON:
const fs = require('fs');
const data = JSON.parse(fs.readFile("path/to/file.json"));
However, the last line gives the error "Unexpected token o in position 1" and the script quits.
I have double-checked the file path and made sure it is correct. Also, if I copy/paste the JSON directly into the script everything works correctly, so I know the file is not corrupt.
What is wrong here?
What @Eugene Tyson suggested regarding using the sync variant of the method or parsing the content in the callback are valid suggestions. However, with this done I still get the error you say. Checking the content of the file read I see that all the double quotes are escaped.
I suggest another way to read the json file. Just require it and you should be good.
const data = require(path to the JSON file)
P.S. :- Make sure the path is relative to your script file
-Manan
Copy link to clipboard
Copied
Does this work?
const fs = require('fs');
const data = JSON.parse(fs.readFileSync("path/to/file.json", 'utf8'));
Copy link to clipboard
Copied
Or maybe this
const fs = require('fs');
fs.readFile("path/to/file.json", 'utf8', (err, data) => {
if (err) {
console.error('Error reading the file:', err);
return;
}
const jsonData = JSON.parse(data);
// Now you can work with the jsonData object here.
});
Copy link to clipboard
Copied
What @Eugene Tyson suggested regarding using the sync variant of the method or parsing the content in the callback are valid suggestions. However, with this done I still get the error you say. Checking the content of the file read I see that all the double quotes are escaped.
I suggest another way to read the json file. Just require it and you should be good.
const data = require(path to the JSON file)
P.S. :- Make sure the path is relative to your script file
-Manan
Copy link to clipboard
Copied
Using require with the path to the json file gives the error "Module not found". I thought require was only for modules, or is there some sort of hack to get around that? From the sound of what you're saying, it appears that this is a bug. Does Adobe have a portal somewhere to report it, or do they look here?
For now, I'll just continue pasting in the json into the script. It's not ideal, but at least I can get things done.
Copy link to clipboard
Copied
It's not a bug reading file using require. I was able to read the file fine usin require. Did you use the path relative to the script?
https://stackoverflow.com/questions/7163061/is-there-a-require-for-json-in-node-js
The other use case that we were trying to solve using readFile is still not working but I am not sure if it's a bug or are we missing something typical to UXP
-Manan
Copy link to clipboard
Copied
I moved the JSON file to the same dir as the script and can now load it using require. However, when I try to process the script, it throws an "object invalid" error. I also tried to apply JSON.parse on the loaded file, but that gives the same error as the original issue, "Unexpected token o in position 1".
I'm going to give up on this one and simply paste the JSON into the script. I don't have the time currently to trouble shoot this.
Thanks for looking into this and giving suggestions.
Copy link to clipboard
Copied
I mistakenly deleted some files and that's why I was getting the error. You're require solution does work. I'll mark it as correct since it's the closest to what I was trying to accomplish.
Thanks for the help.
Copy link to clipboard
Copied
It has already been solved, but I will explain.
UXP plugins can use fs by giving permissions, but UXP scripts cannot for security reasons. Instead, call localFileSystem. In this case, the user must select the file through a dialog. So I am surprised that you can read JSON using require.
const { localFileSystem } = require('uxp').storage ;
const targetEntry = await localFileSystem.getFileForOpening({types: ['json']}) ;
if(targetEntry == null) {return ;}
const data = JSON.parse(await targetEntry.read()) ;
(Edit: UXP scripts could use the fs module without permissions.)
Copy link to clipboard
Copied
Hi @sttk3,
I have tested and the OP as well that the require is able to read the file. Secondly even fs is able to read the file, but as far as I remember it was escaping the double quotes. Lastly, thanks for sharing another way to do this but I would say this ain't a proper replacement of what the OP might be wanting to do, with scripts we many times have use case of silent execution in such cases making selection on a dialog would be disruptive.
-Manan
Copy link to clipboard
Copied
I don’t mean to deny what you said, just that I was pleasantly surprised you found a way to make it work with UXP’s limited file access.
Copy link to clipboard
Copied
Oh I meant to further the discussion by affirming my findings. As if all the scenarios discussed here are true then surely something is broken in UXP implementation in this respect. If security was of consideration then require is bypassing it, and then again even the file is read albeit wrongly.
-Manan