Как разобрать JSON с помощью Node.js? - PullRequest
919 голосов
/ 20 апреля 2011

Как мне проанализировать JSON с помощью Node.js?Есть ли какой-нибудь модуль, который будет проверять и анализировать JSON безопасно?

Ответы [ 31 ]

1053 голосов
/ 20 апреля 2011

Вы можете просто использовать JSON.parse.

Определение JSON объекта является частью спецификации ECMAScript 5 . node.js построен на движке Google Chrome V8 , который соответствует стандарту ECMA. Следовательно, node.js также имеет глобальный объект JSON [документы] .

Примечание - JSON.parse может связать текущий поток, потому что это синхронный метод. Поэтому, если вы планируете анализировать большие объекты JSON, используйте потоковый анализатор json.

647 голосов
/ 21 марта 2012

вы можете требовать .json файлов.

var parsedJSON = require('./file-name');

Например, если у вас есть файл config.json в той же директории, что и файл исходного кода, который вы используете:

var config = require('./config.json');

или (расширение файла может быть опущено):

var config = require('./config');

обратите внимание, что require является синхронным и читает файл только один раз, следующие вызовы возвращают результат из кэша

Также обратите внимание: Вы должны использовать это только для локальных файлов под вашим абсолютным контролем, так как он потенциально выполняет любой код в файле.

302 голосов
/ 07 сентября 2014

Вы можете использовать JSON.parse().

Вы можете использовать объект JSON на любом ECMAScript 5 совместимомРеализация JavaScript.И V8 , на котором построен Node.js, является одним из них.

Примечание. Если вы используете файл JSON для хранения конфиденциальной информации (например, паролей), этонеправильный способ сделать это.Посмотрите, как это делает Heroku: https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application. Узнайте, как это делает ваша платформа, и используйте process.env для получения конфигурационных переменных из кода.


Анализ строкисодержащий данные JSON

var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);

Анализ файла, содержащего данные JSON

Вам потребуется выполнить некоторые файловые операции с модулем fs.

Асинхронная версия

var fs = require('fs');

fs.readFile('/path/to/file.json', 'utf8', function (err, data) {
    if (err) throw err; // we'll not consider error handling for now
    var obj = JSON.parse(data);
});

Синхронная версия

var fs = require('fs');
var json = JSON.parse(fs.readFileSync('/path/to/file.json', 'utf8'));

Хотите использовать require?Подумайте еще раз!

Иногда вы можете использовать require:

var obj = require('path/to/file.json');

Но я не рекомендую это по нескольким причинам:

  1. require синхронно.Если у вас очень большой JSON-файл, он закроет ваш цикл обработки событий.Вам действительно нужно использовать JSON.parse с fs.readFile.
  2. require будет считывать файл только один раз .Последующие вызовы require для того же файла вернут кэшированную копию.Не очень хорошая идея, если вы хотите прочитать файл .json, который постоянно обновляется.Вы можете использовать взломать .Но на этом этапе проще просто использовать fs.
  3. Если ваш файл не имеет расширения .json, require не будет обрабатывать содержимое файла как JSON.

Серьезно!Используйте JSON.parse.


load-json-file module

Если вы читаете большое количество файлов .json (и если вы очень ленивы), он становитсяраздражает писать шаблонный код каждый раз.Вы можете сохранить некоторые символы, используя модуль load-json-file.

const loadJsonFile = require('load-json-file');

Асинхронная версия

loadJsonFile('/path/to/file.json').then(json => {
    // `json` contains the parsed object
});

Синхронная версия

let obj = loadJsonFile.sync('/path/to/file.json');

Разбор JSON из потоков

Если содержимое JSON передается по сети, вам необходимо использовать анализатор потоков JSON.В противном случае он свяжет ваш процессор и закроет цикл обработки событий, пока содержимое JSON не будет полностью передано в потоковом режиме.

Для NPM доступно множество пакетов .Выберите, что лучше для вас.


Обработка ошибок / Безопасность

Если вы не уверены, что все, что передано в JSON.parse(), является допустимым JSON , убедитесь, чтозаключить звонок в JSON.parse() внутри блока try/catch.Предоставленная пользователем строка JSON может привести к сбою приложения и даже к дырам в безопасности.Убедитесь, что обработка ошибок выполнена, если вы анализируете предоставленный извне JSON.

81 голосов
/ 20 апреля 2011

используйте объект JSON :

JSON.parse(str);
33 голосов
/ 24 июля 2013

Другой пример JSON.parse:

var fs = require('fs');
var file = __dirname + '/config.json';

fs.readFile(file, 'utf8', function (err, data) {
  if (err) {
    console.log('Error: ' + err);
    return;
  }

  data = JSON.parse(data);

  console.dir(data);
});
32 голосов
/ 27 августа 2012

Я хотел бы отметить, что существуют альтернативы глобальному объекту JSON. JSON.parse и JSON.stringify являются синхронными, поэтому, если вы хотите работать с большими объектами, вы можете проверить некоторые из асинхронных модулей JSON.

Посмотрите: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json

29 голосов
/ 03 апреля 2014

Включите библиотеку node-fs.

var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));

Для получения дополнительной информации о библиотеке 'fs' см. Документацию по http://nodejs.org/api/fs.html

9 голосов
/ 26 июля 2013

Так как вы не знаете, что ваша строка действительно допустима, я бы поставил ее сначала в try-catch. Кроме того, поскольку блоки try catch не оптимизируются узлом, я бы поместил все это в другую функцию:

function tryParseJson(str) {
    try {
        return JSON.parse(str);
    } catch (ex) {
        return null;
    }
}

ИЛИ в "асинхронном стиле"

function tryParseJson(str, callback) {
    process.nextTick(function () {
      try {
          callback(null, JSON.parse(str));
      } catch (ex) {
          callback(ex)
      }
    })
}
8 голосов
/ 10 июля 2013

Парсинг потока JSON?Используйте JSONStream.

var request = require('request')
  , JSONStream = require('JSONStream')

request({url: 'http://isaacs.couchone.com/registry/_all_docs'})
    .pipe(JSONStream.parse('rows.*'))
    .pipe(es.mapSync(function (data) {
      return data
    }))

https://github.com/dominictarr/JSONStream

6 голосов
/ 12 июня 2013
JSON.parse("your string");

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...