Как мне проанализировать JSON с помощью Node.js? Есть ли какой-нибудь модуль, который будет проверять и анализировать JSON безопасно?
javascript
json
node.js
Тихон Джелвис
источник
источник
Вы можете требовать файлы .json.
Например, если у вас есть
config.json
файл в том же каталоге, что и файл исходного кода, который вы используете:или (расширение файла может быть опущено):
обратите внимание , что
require
это синхронное и читает только файл один раз , следующие вызовы возвращают результат из кэшаТакже обратите внимание, что вы должны использовать это только для локальных файлов под вашим абсолютным контролем, так как он потенциально выполняет любой код в файле.
источник
require
это синхронно. Если вы хотите использовать дружественное асинхронное использованиеfs.readFile
вместо этогоJSON.parse
.json
расширение! Если ваш файл НЕ имеет.json
расширения, require не будет обрабатывать его как файл json.Вы можете использовать
JSON.parse()
.Вы должны иметь возможность использовать
JSON
объект в любой реализации JavaScript, совместимой с ECMAScript 5 . И V8 , на котором построен Node.js, является одним из них.Разбор строки, содержащей данные JSON
Разбор файла, содержащего данные JSON
Вам придется выполнить некоторые файловые операции с
fs
модулем.Асинхронная версия
Синхронная версия
Вы хотите использовать
require
? Подумай еще раз!Иногда вы можете использовать
require
:Но я не рекомендую это по нескольким причинам:
require
синхронно Если у вас очень большой JSON-файл, он закроет ваш цикл событий. Вам действительно нужно использоватьJSON.parse
сfs.readFile
.require
будет читать файл только один раз . Последующие обращения кrequire
тому же файлу вернут кэшированную копию. Не очень хорошая идея, если вы хотите прочитать.json
файл, который постоянно обновляется. Вы могли бы использовать взломать . Но на данный момент проще использоватьfs
..json
расширения,require
содержимое файла не будет обрабатываться как JSON.Шутки в сторону! Использование
JSON.parse
.load-json-file
модульЕсли вы читаете большое количество
.json
файлов (и если вы очень ленивы), каждый раз становится неудобно писать шаблонный код. Вы можете сохранить некоторые символы с помощьюload-json-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?» и даже не стал документировать побочные эффекты. Это также означало, что require принимает файлы на двух языках: JavaScript и JSON (нет, они не одинаковы). Так много для SRP.используйте объект JSON :
источник
Еще один пример JSON.parse:
источник
Я хотел бы отметить, что есть альтернативы глобальному объекту 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
библиотеку.Для получения дополнительной информации о библиотеке 'fs' см. Документацию по адресу http://nodejs.org/api/fs.html.
источник
Так как вы не знаете, что ваша строка на самом деле действительна, я бы поставил ее сначала в попытку. Кроме того, поскольку блоки try catch не оптимизируются узлом, я бы поместил все это в другую функцию:
ИЛИ в "асинхронном стиле"
источник
Разбор потока JSON? Использование
JSONStream
.https://github.com/dominictarr/JSONStream
источник
Все здесь рассказывали о JSON.parse, поэтому я подумал сказать что-то еще. Есть отличный модуль Connect со многими промежуточными программами, чтобы сделать разработку приложений проще и лучше. Одним из промежуточных программ является bodyParser . Он анализирует JSON, html-формы и т. Д. Существует также специальное промежуточное ПО для анализа только JSON noop .
Посмотрите на ссылки выше, это может быть очень полезно для вас.
источник
Это все.
источник
как уже упоминалось в других ответах, вы, вероятно, захотите либо потребовать локальный файл json, который, как вы знаете, безопасен и присутствует, например, файл конфигурации:
или использовать глобальный объект JSON для анализа строкового значения в объекте:
обратите внимание, что когда вам требуется файл, его содержимое оценивается, что создает угрозу безопасности в случае, если это не файл json, а файл js.
здесь я опубликовал демо, где вы можете увидеть оба метода и поиграть с ними онлайн (пример разбора находится в файле app.js - затем нажмите на кнопку «Выполнить» и увидите результат в терминале): http: // staging1 .codefresh.io / лаборатория / API / ENV / JSON-синтаксический анализ, например ,
Вы можете изменить код и увидеть влияние ...
источник
Используете JSON для своей конфигурации с Node.js? Прочитайте это и получите навыки настройки более 9000 ...
Правильные приложения входят в 3+ уровня конфигурации:
Большинство разработчиков относятся к конфигурации своего сервера и приложения так, как будто они могут измениться. Не может Вы можете накладывать изменения из более высоких слоев друг на друга, но вы изменяете базовые требования . Некоторые вещи должны существовать! Сделайте так, чтобы ваш конфиг действовал так, как будто он неизменен, потому что некоторые из них, в основном, как ваш исходный код
Если вы не увидите, что многие вещи не изменятся после запуска, это приведет к анти-шаблонам, таким как засорение вашей конфигурации загрузкой блоков try / catch, и притворство, что вы можете продолжить работу без правильно настроенного приложения. Ты не можешь Если вы можете, это относится к уровню конфигурации сообщества / пользователя, а не к уровню конфигурации сервера / приложения. Вы просто делаете это неправильно. Необязательные элементы должны быть расположены сверху, когда приложение завершает загрузку.
Хватит биться головой об стену: ваш конфиг должен быть очень простым .
Посмотрите, как просто настроить такую сложную инфраструктуру, как независимая от протокола и независимой от источника данных служба, с помощью простого файла конфигурации json и простого файла app.js ...
контейнер-config.js ...
index.js ... (двигатель, который питает все)
app.js ... (код, обеспечивающий работу службы, не зависящей от протокола и источника данных)
Используя этот шаблон, вы теперь можете загружать файлы конфигурации сообщества и пользователей поверх загруженного приложения, dev ops готов поместить вашу работу в контейнер и масштабировать ее. Вы читаете за мультитенант. Userland изолирован. Теперь вы можете разделить вопросы о том, какой протокол службы вы используете, какой тип базы данных вы используете, и просто сосредоточиться на написании хорошего кода.
Поскольку вы используете слои, вы можете полагаться на единый источник правды для всего в любое время (многоуровневый объект конфигурации) и избегать проверок ошибок на каждом этапе, беспокоясь о "о, черт, как я собираюсь сделать это работать без правильной конфигурации?!? ".
источник
Мое решение:
источник
TypeError: path must be a string or Buffer
ошибки - есть идеи, где начать отладку этой проблемы?Просто хочу завершить ответ (как я некоторое время боролся с ним), хочу показать, как получить доступ к информации json, этот пример показывает доступ к массиву Json:
источник
Просто, чтобы сделать это как можно более сложным, и принести как можно больше пакетов ...
Это позволяет вам делать:
Или, если вы используете async / await:
Преимущество перед простым использованием
readFileSync
заключается в том, что ваш Node-сервер может обрабатывать другие запросы во время чтения файла с диска.источник
JSON.parse не обеспечит безопасность анализируемой строки json. Вы должны посмотреть на библиотеку, такую как json-safe-parse или похожую библиотеку.
Со страницы json-safe-parse npm:
источник
Используйте функцию попытки Lodash для возврата объекта ошибки, который вы можете обработать с помощью функции isError.
источник
.bind
вместо использования _.attempt (JSON.parse, str)Всегда обязательно используйте JSON.parse в блоке try catch, поскольку узел всегда генерирует непредвиденную ошибку, если в вашем json есть поврежденные данные, поэтому используйте этот код вместо простого JSON.Parse
источник
Если вы хотите добавить некоторые комментарии в ваш JSON и разрешить использовать запятые, вы можете использовать следующую реализацию:
Обратите внимание, что это может не сработать, если у вас есть что-то вроде
"abc": "foo // bar"
вашего JSON. Итак, YMMV.источник
Если исходный файл JSON довольно большой, возможно, стоит рассмотреть асинхронный маршрут с помощью нативного подхода async / await с Node.js 8.0 следующим образом
источник
Я использую FS-Extra . Мне это очень нравится, потому что - хотя он поддерживает обратные вызовы - он также поддерживает обещания . Так что это просто позволяет мне писать свой код гораздо более читабельным способом:
У этого также есть много полезных методов, которые не идут вместе со стандартным
fs
модулем, и , кроме того, он также соединяет методы из собственногоfs
модуля и обещает их.Так что это в основном все преимущества. Я надеюсь, что другие найдут это полезным.
источник
Если вам нужно проанализировать JSON с Node.js безопасным способом (иначе: пользователь может вводить данные или через публичный API), я бы предложил использовать secure-json-parse .
Использование по умолчанию,
JSON.parse
но оно защитит ваш код от:источник
Вы можете использовать JSON.parse () (это встроенная функция, которая, вероятно, заставит вас заключить ее в операторы try-catch).
Или используйте некоторую библиотеку JSON для анализа npm, что-то вроде json-parse-or
источник
Используйте это, чтобы быть на безопасной стороне
источник
NodeJs - это сервер на основе JavaScript , так что вы можете делать то же самое, что и в чистом JavaScript ...
Представьте, что у вас есть этот Json в NodeJs ...
И вы можете сделать выше, чтобы получить разобранную версию вашего JSON ...
источник
Как уже упоминалось в ответах выше, мы можем использовать
JSON.parse()
синтаксический анализ строк в JSON. Но перед синтаксическим анализом обязательно проанализируйте правильные данные, иначе это может привести к остановке всего приложения.это безопасно использовать как это
источник
Использование
JSON.parse(str);
. Подробнее об этом читайте здесь .Вот некоторые примеры:
источник
Никаких дополнительных модулей не требуется.
Просто используйте,
var parsedObj = JSON.parse(yourObj);
я не думаю, что есть какие-либо проблемы безопасности в связи с этим
источник
Это просто, вы можете конвертировать JSON в строку, используя
JSON.stringify(json_obj)
, и конвертировать строку в JSON, используяJSON.parse("your json string")
.источник