#javascript #json #node.js #parsing #fs
#javascript #json #node.js #синтаксический анализ #fs
Вопрос:
У меня есть файл JSON с большим количеством содержимого, и я загружаю его с помощью fs Node.js модуль. Но когда я заглядываю в файл JSON, я заметил, что ко многим именам полей прикреплена строка символов, которая делает невозможным таргетинг в JS. Это выглядит примерно так:
"bk:ParentField": {
"bk:Field": "Value",
"bk:Field2": "Value2"
}
Я хочу удалить bk:
часть, потому что я не могу настроить таргетинг на объекты с ними в нем. Мой код выглядит следующим образом :
var contents = fs.readFileSync("results.json");
var jsonContent = JSON.parse(JSON.stringify(contents).replace(/bk:/g, '' ));
Проблема в том, что всякий раз, когда я пытаюсь настроить таргетинг на элемент после выполнения приведенного выше кода, я получаю сообщение об ошибке undefined или, если я делаю что-то подобное jsonContent['bk:ParentField']
, я все еще получаю неопределенную ошибку.
Есть идеи о том, почему это могло произойти? Или есть обходной путь для таргетинга на объекты с помощью ‘bk:’?
Комментарии:
1. Вы знаете, что можете просто сделать
obj['bk:ParentField']
, чтобы получить доступ к этим ключам2. Да, но я получаю ошибку, когда пытаюсь это сделать, из-за двоеточия внутри.
3. У меня это работает просто отлично -> jsfiddle.net/adeneo/g4m4g2hv/1
4. Попробовал ваш код, и, похоже, он работает. Как получить доступ к полям?
5. Я пробовал способ, указанный @adeneo, но это не сработало
Ответ №1:
Функция readFileSync возвращает буфер, если кодировка не предоставлена, и JSON.stringify
принимает объект, не являющийся строкой или буфером.
Просто вызовите toString()
буфер contents
перед использованием replace()
, а затем используйте JSON.parse
для создания объекта JavaScript:
fs = require('fs');
var contents = fs.readFileSync("test.json");
var data = JSON.parse(contents.toString().replace(/bk:/g, ''));
Или укажите кодировку:
fs = require('fs');
var contents = fs.readFileSync("test.json", "utf-8");
var data = JSON.parse(contents.replace(/bk:/g, ''));
Оба метода дают ожидаемый результат и позволяют осуществлять доступ к свойствам с помощью .
оператора:
console.log(data.ParentField.Field);
replace
Не является строго обязательным, если вы не возражаете против доступа к таким свойствам, как so:
var data = JSON.parse(fs.readFileSync("test.json", "utf-8"));
console.log(data["bk:ParentField"]["bk:Field"])
Комментарии:
1. Это сработало великолепно! Я не уверен, почему
stringify
или что-то подобное этомуobj['bk:ParentField']
не сработало.2. @VicDid
stringify
принимает объект, я обновил свой ответ, надеюсь, теперь это понятно.
Ответ №2:
Похоже, что ваша проблема заключается не :
в ключах объекта, а в том факте, что в вашей строке JSON нет вложений {}
, что делает ее недействительной. Смотрите этот пример:
var parsed = JSON.parse(`{
"bk:ParentField": {
"bk:Field": "Value",
"bk:Field2": "Value2"
}
}`)
console.log(parsed['bk:ParentField'])
Комментарии:
1. JSON в файле заключен в скобки. Проблема заключалась в двоеточии. В некоторых ошибках даже специально указано двоеточие.
2. Я думаю, что я неправильно истолковал ваш вопрос — возможно, было бы полезно, если бы вы добавили конкретную ошибку в свой вопрос.