Удаление экземпляров строки из файла JSON и затем ее синтаксический анализ

#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. Я думаю, что я неправильно истолковал ваш вопрос — возможно, было бы полезно, если бы вы добавили конкретную ошибку в свой вопрос.