У меня возникают проблемы при попытке разобрать пустой (стробированный) массив из файла JSON вместо того, чтобы возвращать пустой массив, я получаю строку.
Начальная настройка файла JSON:
"[]"
Я назначаю анализируемые данные переменной с помощью файловой системы
let parsedObjs = JSON.parse(fs.readFileSync(__dirname + '/data/employees.json'));
Когда я пытаюсь это сделать в консоли браузера, я получаю пустой массив, как и следовало ожидать:
JSON.parse("[]")
> []
Однако в Node/Express я возвращаю строку:
console.log(type of:', typeof parsedObjs);
> type of: string
Как ни странно, если я создаю исходный файл как неструктурированный массив, он возвращает массив:
> []
Но, конечно, это приводит к ошибке "Неожиданный конец JSON".
Я очень новичок в этом, пожалуйста, скажите мне, что я делаю неправильно. Спасибо.
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Функция в целом:
function populateSelectors(selector) {
let foundOptions = [];
let parsedObjs = JSON.parse(fs.readFileSync('./data/employees.json'));
parsedObjs.forEach(obj => {
let key = Object.keys(obj)[0];
let optionName = obj[key][selector];
if (foundOptions.indexOf(optionName) === -1 ) {
foundOptions.push(optionName);
}
});
return foundOptions;
}
ERROR in Full (я, очевидно, изменил полный путь):
SyntaxError: Unexpected end of JSON input
application.js:630
at JSON.parse (<anonymous>)
at Object.populateSelectors (<FULL PATH>\Rota Application 2\staff.js:14:27)
at <FULL PATH>\Rota Application 2\app.js:45:28
at Layer.handle [as handle_request] (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\layer.js:95:5)
at next (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (<FULL PATH>\Rota Application 2\node_modules\express\lib\router\layer.js:95:5)
at <FULL PATH>\Rota Application 2\node_modules\express\lib\router\index.js:281:22
РЕШИТЬ!
Проблема в том, что у меня был метод writeFile в другом месте, они оба пытались получить доступ к файлу одновременно. Я изменил его на writeFileSync, и проблема решена!
Это нормально, файл не в правильном формате, вы должны удалить кавычки.
[]
JSON.parse("[]") работает с кавычками, потому что вы должны передать строку в функцию синтаксического анализа.
Лучше догадаться, что происходит:
Если вы сохраняете свой пустой массив как "[]"
в своем файле, когда вы читаете его в узле JS, строка, просматриваемая синтаксическим разбором, будет выглядеть так: "\"[]\""
.
Итак, что касается анализатора, он разбирает строку и возвращает строку. (Как делать JSON.parse('\"[]\"');
)
Любой файл, считанный readFile
будет readFile
STRING. Поэтому достаточно оставить свой пустой массив как []
без кавычек в вашем файле JSON
[]
. И я попытался разобрать его так: var x = JSON.parse(fs.readFileSync('./t.json'))
и он работал как положено. Можете ли вы поделиться своим звонком и полной ошибкой? Я вижу некоторые из них в вопросе, но это сбивает с толку, потому что есть синтаксические ошибки, такие как: console.log(type of:', typeof parsedObjs);