Як я повинен аналізувати JSON за допомогою Node.js? Чи є якийсь модуль, який буде надійно перевіряти та аналізувати JSON?
Як я повинен аналізувати JSON за допомогою Node.js? Чи є якийсь модуль, який буде надійно перевіряти та аналізувати JSON?
Відповіді:
Ви можете просто використовувати JSON.parse
.
Визначення JSON
об'єкта є частиною специфікації ECMAScript 5 . node.js побудований на двигуні V8 Google Chrome , який відповідає стандарту ECMA. Тому node.js також має глобальний об’єкт [docs] .JSON
Примітка - JSON.parse
може зв’язати поточну нитку, оскільки це синхронний метод. Тож якщо ви плануєте розбирати великі об’єкти JSON, використовуйте потоковий аналізатор json.
Ви можете вимагати .json файлів.
var parsedJSON = require('./file-name');
Наприклад, якщо у вас є config.json
файл у тому самому каталозі, що і ваш файл вихідного коду, ви використовуєте:
var config = require('./config.json');
або (розширення файлу можна опустити):
var config = require('./config');
зауважте, що require
це синхронно і читає файл лише один раз , після викликів повертає результат із кешу
Також зверніть увагу: Ви повинні використовувати це лише для локальних файлів під вашим абсолютним контролем, оскільки це потенційно може виконувати будь-який код у файлі.
require
це синхронно. Якщо ви хочете асинхронізувати дружнє використання fs.readFile
замість цьогоJSON.parse
.json
розширенням! Якщо у вашому файлі НЕ є .json
розширення, потрібно не розглядати його як json-файл.
Можна використовуватиJSON.parse()
.
Ви повинні мати можливість використовувати JSON
об'єкт у будь-якій сумісній програмі JavaScript ECMAScript 5 . І V8 , на якому побудований Node.js, є одним із них.
Примітка. Якщо ви використовуєте файл JSON для зберігання конфіденційної інформації (наприклад, паролів), це неправильний спосіб зробити це. Подивіться, як це робить Heroku: https://devcenter.heroku.com/articles/config-vars#setting-up-config-vars-for-a-deployed-application . Дізнайтеся, як це робить ваша платформа, і скористайтеся
process.env
для отримання конфігураційних параметрів з коду.
var str = '{ "name": "John Doe", "age": 42 }';
var obj = JSON.parse(str);
Вам доведеться виконати деякі файлові операції з 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');
Але я не рекомендую цього з кількох причин:
require
є синхронним. Якщо у вас дуже великий файл JSON, він задушить ваш цикл подій. Вам дійсно потрібно використовувати JSON.parse
з fs.readFile
.require
прочитає файл лише один раз . Подальші дзвінки до require
того ж файлу повернуть кешовану копію. Непогана ідея, якщо ви хочете читати .json
файл, який постійно оновлюється. Ви можете використовувати хак . Але в цей момент простіше простого використання fs
..json
розширення, require
він не сприйме вміст файлу як JSON.Серйозно! ВикористовуйтеJSON.parse
.
load-json-file
модульЯкщо ви читаєте велику кількість .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 не буде повністю потоково передано.
Для цього в NPM є багато пакетів . Виберіть те, що найкраще для вас.
Якщо ви не впевнені, то , що передається JSON.parse()
є дійсним JSON , переконайтеся , що вкласти виклик JSON.parse()
всередині try/catch
блоку. Користувач, який надав рядок JSON, може призвести до збоїв у вашій програмі та навіть може призвести до ям у безпеці. Переконайтеся, що обробка помилок виконується, якщо ви аналізуєте наданий зовнішньою програмою JSON.
and could even lead to security holes
з цікавості, як?
<script>...
, а помилка перекинулася на сторону клієнта, у вас є помилка XSS. Тому IMO важливо обробляти помилки JSON саме там, де ви їх розбираєте.
require
для включення JSON?" і навіть не турбував документування побічних ефектів. Це також означало, що потрібно приймати файли двома мовами: JavaScript та JSON (ні, вони не однакові). Стільки для СРП.
використовувати об'єкт JSON :
JSON.parse(str);
Ще один приклад 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);
});
Я хотів би зазначити, що існують альтернативи глобальному об'єкту JSON.
JSON.parse
і JSON.stringify
вони обидва синхронні, тому якщо ви хочете мати справу з великими об'єктами, ви можете перевірити деякі з асинхронних модулів JSON.
Подивіться: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
JSON.parse
всією вашою програмою, вийде з ладу або, використовуючи process.on('uncaughtException', function(err) { ... });
, з часом не буде шансу надіслати користувачеві помилку "неправильний JSON".
async
парсер? Я не знайшов.
Включіть node-fs
бібліотеку.
var fs = require("fs");
var file = JSON.parse(fs.readFileSync("./PATH/data.json", "utf8"));
Для отримання додаткової інформації про бібліотеку 'fs', зверніться до документації за адресою http://nodejs.org/api/fs.html
Оскільки ви не знаєте, що ваша строка дійсно дійсна, я б поставив її спочатку в спробу лову. Крім того, оскільки блоки спробу лову не оптимізовані вузлом, я б поставив всю річ в іншу функцію:
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)
}
})
}
Розбір потоку 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
}))
Усі тут розповіли про JSON.parse, тому я подумав сказати щось інше. Є чудовий модуль Підключення до багатьох проміжних програм, щоб полегшити та покращити розробку програм. Одне з проміжних програм - bodyParser . Він аналізує JSON, html-форми та ін. Існує також специфічне проміжне програмне забезпечення для розбору JSON тільки noop .
Подивіться на посилання вище, це може бути вам дуже корисно.
JSON.parse("your string");
Це все.
як згадуються тут інші відповіді, ви, мабуть, хочете або вимагати локальний файл json, який, на вашу думку, є безпечним і присутнім, як файл конфігурації:
var objectFromRequire = require('path/to/my/config.json');
або використовувати глобальний об'єкт JSON для розбору значення рядка в об'єкт:
var stringContainingJson = '\"json that is obtained from somewhere\"';
var objectFromParse = JSON.parse(stringContainingJson);
зауважте, що коли вам потрібен файл, оцінюється вміст цього файлу, що вводить ризик для безпеки, якщо це не файл json, а js-файл.
тут я опублікував демонстраційну версію, де ви можете побачити обидва методи та грати з ними в Інтернеті (приклад розбору - у файлі app.js - потім натисніть кнопку запуску та побачите результат у терміналі): http: // staging1 .codefresh.io / labs / api / env / json-parse-example
ви можете змінити код і побачити вплив ...
Використовуєте JSON для конфігурації з Node.js? Прочитайте це і отримайте свої навички налаштування понад 9000 ...
Примітка. Люди, які стверджують, що дані = вимагають ('./ data.json'); є ризиком для безпеки і прихильнюючи відповіді людей із ревним завзяттям: Ви абсолютно і зовсім помиляєтесь . Спробуйте помістити в цей файл не-JSON ... Вузол дасть вам помилку, точно так само, як якщо б ви зробили те ж саме з набагато повільнішим і складнішим кодом для читання файлів вручну, а потім подальшого JSON.parse (). Будь ласка, припиніть поширювати дезінформацію; ти шкодиш світу, не допомагаєш. Вузол був розроблений, щоб це допустити; це не ризик для безпеки!
Власні програми поставляються в 3+ шарах конфігурації:
Більшість розробників трактують їх сервер та конфігурацію додатків так, ніби вони можуть змінитися. Це не може. Ви можете наносити зміни на більш високі шари один на одного, але ви змінюєте базові вимоги . Деякі речі повинні існувати! Зробіть так, щоб ваш конфігурація діяв так, як це непорушно, оскільки частина його в основному є, як і ваш вихідний код.
Якщо не помітити, що багато ваших речей не буде змінено після запуску, це призводить до анти-моделей, таких як засмічення завантаження конфігурації блоками спробу / лову, і вигляд, що ви можете продовжувати без належної програми налаштування. Ви не можете. Якщо ви можете, це належить до конфігураційного рівня спільноти / користувача, а не конфігураційного рівня сервера / програми. Ти просто робиш це неправильно. Факультативний матеріал повинен бути шаруватий зверху, коли додаток закінчується завантаженням.
Перестаньте стукати головою об стіну: ваш конфігурація повинна бути надто простою .
Погляньте на те, як легко налаштувати щось настільки складне, як протокол-агностик та сервіс даних-джерела агностіки, використовуючи простий файл конфігурації json та простий файл app.js ...
container-config.js ...
{
"service": {
"type" : "http",
"name" : "login",
"port" : 8085
},
"data": {
"type" : "mysql",
"host" : "localhost",
"user" : "notRoot",
"pass" : "oober1337",
"name" : "connect"
}
}
index.js ... (двигун, який працює на все)
var config = require('./container-config.json'); // Get our service configuration.
var data = require(config.data.type); // Load our data source plugin ('npm install mysql' for mysql).
var service = require(config.service.type); // Load our service plugin ('http' is built-in to node).
var processor = require('./app.js'); // Load our processor (the code you write).
var connection = data.createConnection({ host: config.data.host, user: config.data.user, password: config.data.pass, database: config.data.name });
var server = service.createServer(processor);
connection.connect();
server.listen(config.service.port, function() { console.log("%s service listening on port %s", config.service.type, config.service.port); });
app.js ... (код, який надає повноваження вашій протокольно-агностичній службі та агностичній службі джерела даних)
module.exports = function(request, response){
response.end('Responding to: ' + request.url);
}
За допомогою цього шаблону ви можете зараз завантажувати файли спільноти та налаштування користувачів поверх завантаженого додатка, програма розробників готова засунути вашу роботу в контейнер і масштабувати її. Ви читали для багатостороннього. Користувальниця ізольована. Тепер ви можете відокремити питання про те, який протокол обслуговування ви використовуєте, тип бази даних, який ви використовуєте, і просто зосередитися на написанні хорошого коду.
Оскільки ви використовуєте шари, ви можете покладатися на єдине джерело істини для всіх, в будь-який час (шарувата об'єкта конфігурації), і перевірка помилок уникнути на кожному кроці, піклуючись про «про лайно, як я збираюся зробити це працювати без належної конфігурації?!? ".
Моє рішення:
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);
});
TypeError: path must be a string or Buffer
помилки - будь-яка ідея, з чого почати налагодження цієї проблеми?
Просто хочу виконати відповідь (коли я боровся з нею деякий час), хочу показати, як отримати доступ до інформації json, у цьому прикладі показано доступ до Json Array:
var request = require('request');
request('https://server/run?oper=get_groups_joined_by_user_id&user_id=5111298845048832', function (error, response, body) {
if (!error && response.statusCode == 200) {
var jsonArr = JSON.parse(body);
console.log(jsonArr);
console.log("group id:" + jsonArr[0].id);
}
})
Просто, щоб зробити це якомога складніше і принести якомога більше пакетів ...
const fs = require('fs');
const bluebird = require('bluebird');
const _ = require('lodash');
const readTextFile = _.partial(bluebird.promisify(fs.readFile), _, {encoding:'utf8',flag:'r'});
const readJsonFile = filename => readTextFile(filename).then(JSON.parse);
Це дозволяє:
var dataPromise = readJsonFile("foo.json");
dataPromise.then(console.log);
Або якщо ви використовуєте async / wait:
let data = await readJsonFile("foo.json");
Перевага перед просто використанням readFileSync
полягає в тому, що ваш сервер Node може обробляти інші запити під час зчитування файлу з диска.
JSON.parse не забезпечить безпеку рядка json, який ви розбираєте. Ви повинні дивитися на бібліотеку на зразок json-safe-розбору або подібної бібліотеки.
З сторінки json-safe-розбору npm:
JSON.parse чудовий, але він має один серйозний недолік у контексті JavaScript: він дозволяє переосмислити успадковані властивості. Це може стати проблемою, якщо ви аналізуєте JSON з ненадійного джерела (наприклад, користувача) та викликуте на ньому функцій, які ви могли б очікувати існування.
Використовуйте спробу функції Лодаша повернути об'єкт помилки, з яким можна обробити функцію isError.
// Returns an error object on failure
function parseJSON(jsonString) {
return _.attempt(JSON.parse.bind(null, jsonString));
}
// Example Usage
var goodJson = '{"id":123}';
var badJson = '{id:123}';
var goodResult = parseJSON(goodJson);
var badResult = parseJSON(badJson);
if (_.isError(goodResult)) {
console.log('goodResult: handle error');
} else {
console.log('goodResult: continue processing');
}
// > goodResult: continue processing
if (_.isError(badResult)) {
console.log('badResult: handle error');
} else {
console.log('badResult: continue processing');
}
// > badResult: handle error
.bind
замість того, щоб просто використовувати _.attempt (JSON.parse, str)
Завжди обов'язково використовуйте JSON.parse у блоці спробу лову, оскільки вузол завжди кидає несподівану помилку, якщо у json у вас є пошкоджені дані, тому використовуйте цей код замість простого JSON.Parse
try{
JSON.parse(data)
}
catch(e){
throw new Error("data is corrupted")
}
Якщо ви хочете додати деякі коментарі до свого JSON та дозволити пропуски комок, можливо, ви хочете використовувати нижче виконання:
var fs = require('fs');
var data = parseJsData('./message.json');
console.log('[INFO] data:', data);
function parseJsData(filename) {
var json = fs.readFileSync(filename, 'utf8')
.replace(/\s*\/\/.+/g, '')
.replace(/,(\s*\})/g, '}')
;
return JSON.parse(json);
}
Зверніть увагу, що це може не спрацювати, якщо у вас є щось подібне "abc": "foo // bar"
у вашому JSON. Так YMMV.
Якщо вихідний файл JSON досить великий, можливо, потрібно розглянути асинхронний маршрут через натиснутий підхід async / очікувати з Node.js 8.0 наступним чином
const fs = require('fs')
const fsReadFile = (fileName) => {
fileName = `${__dirname}/${fileName}`
return new Promise((resolve, reject) => {
fs.readFile(fileName, 'utf8', (error, data) => {
if (!error && data) {
resolve(data)
} else {
reject(error);
}
});
})
}
async function parseJSON(fileName) {
try {
return JSON.parse(await fsReadFile(fileName));
} catch (err) {
return { Error: `Something has gone wrong: ${err}` };
}
}
parseJSON('veryBigFile.json')
.then(res => console.log(res))
.catch(err => console.log(err))
Я використовую fs-extra . Мені це дуже подобається, тому що, хоча він підтримує зворотні дзвінки, він також підтримує Обіцяння . Тож це просто дозволяє мені записати свій код набагато читабельнішим чином:
const fs = require('fs-extra');
fs.readJson("path/to/foo.json").then(obj => {
//Do dome stuff with obj
})
.catch(err => {
console.error(err);
});
Він також має багато корисних методів, які не поєднуються зі стандартним fs
модулем, і , крім того, він також з'єднує методи з рідного fs
модуля та обіцяє їх.
ПРИМІТКА. Ви все ще можете використовувати вбудовані методи Node.js. Вони обіцяні та скопійовані у fs-extra. Переглянути примітки до
fs.read()
&fs.write()
Так що це в основному всі переваги. Я сподіваюся, що інші вважають це корисним.
Якщо вам потрібно захистити JSON з Node.js захищеним способом (він же: користувач може вводити дані або публічний API), я б запропонував використовувати secure-json-синтаксичний аналіз .
Використання, як за замовчуванням, JSON.parse
але захистить ваш код від:
const badJson = '{ "a": 5, "b": 6, "__proto__": { "x": 7 }, "constructor": {"prototype": {"bar": "baz"} } }'
const infected = JSON.parse(badJson)
console.log(infected.x) // print undefined
const x = Object.assign({}, infected)
console.log(x.x) // print 7
const sjson = require('secure-json-parse')
console.log(sjson.parse(badJson)) // it will throw by default, you can ignore malicious data also
Ви можете використовувати JSON.parse () (яка є вбудованою функцією, яка, ймовірно, змусить вас обернути це заявами про випробування).
Або використовуйте яку-небудь бібліотеку JSON для розбору npm, щось на зразок json-parse-або
Використовуйте це для безпечної сторони
var data = JSON.parse(Buffer.concat(arr).toString());
NodeJs - сервер на базі JavaScript , тому ви можете робити так, як це робите в чистому JavaScript ...
Уявіть, у вас цей Json у NodeJs ...
var details = '{ "name": "Alireza Dezfoolian", "netWorth": "$0" }';
var obj = JSON.parse(details);
І ви можете зробити вище, щоб отримати проаналізовану версію вашого json ...
Як згадувалося у вищенаведених відповідях, ми можемо використовувати JSON.parse()
для розбору рядків JSON. Але перед тим, як проаналізувати, не забудьте проаналізувати правильні дані, інакше це може звести всю вашу програму
безпечно використовувати його так
let parsedObj = {}
try {
parsedObj = JSON.parse(data);
} catch(e) {
console.log("Cannot parse because data is not is proper json format")
}
Використовуйте JSON.parse(str);
. Детальніше про це читайте тут .
Ось кілька прикладів:
var jsonStr = '{"result":true, "count":42}';
obj = JSON.parse(jsonStr);
console.log(obj.count); // expected output: 42
console.log(obj.result); // expected output: true
Це просто, ви можете конвертувати JSON в рядок за допомогою JSON.stringify(json_obj)
, а конвертувати рядок в JSON за допомогою JSON.parse("your json string")
.