¿Cómo debería analizar JSON usando Node.js? ¿Hay algún módulo que valide y analice JSON de forma segura?
javascript
json
node.js
Tikhon Jelvis
fuente
fuente
puede requerir archivos .json.
Por ejemplo, si tiene un
config.json
archivo en el mismo directorio que su archivo de código fuente, usaría:o (se puede omitir la extensión del archivo):
tenga en cuenta que
require
es sincrónico y solo lee el archivo una vez , las siguientes llamadas devuelven el resultado del cachéTambién tenga en cuenta que solo debe usar esto para archivos locales bajo su control absoluto, ya que potencialmente ejecuta cualquier código dentro del archivo.
fuente
require
es sincrónico. Si quieres asíncrono uso amigablefs.readFile
conJSON.parse
.json
extensión! Si su archivo NO tiene la.json
extensión, require no lo tratará como un archivo json.Puedes usar
JSON.parse()
.Debería poder utilizar el
JSON
objeto en cualquier implementación de JavaScript compatible con ECMAScript 5 . Y V8 , sobre el cual se construye Node.js, es uno de ellos.Analizando una cadena que contiene datos JSON
Analizando un archivo que contiene datos JSON
Tendrás que hacer algunas operaciones de archivo con el
fs
módulo.Versión asincrónica
Versión sincrónica
Quieres usar
require
? ¡Piensa otra vez!A veces puedes usar
require
:Pero no recomiendo esto por varias razones:
require
es sincrónico Si tiene un archivo JSON muy grande, ahogará su bucle de eventos. Realmente necesitas usarJSON.parse
confs.readFile
.require
leerá el archivo solo una vez . Las llamadas posteriores alrequire
mismo archivo devolverán una copia en caché. No es una buena idea si desea leer un.json
archivo que se actualiza continuamente. Podrías usar un truco . Pero en este punto, es más fácil de usarfs
..json
extensión,require
no tratará el contenido del archivo como JSON.¡Seriamente! Uso
JSON.parse
.load-json-file
móduloSi está leyendo una gran cantidad de
.json
archivos (y si es extremadamente vago), se vuelve molesto escribir código repetitivo cada vez. Puede guardar algunos caracteres usando elload-json-file
módulo.Versión asincrónica
Versión sincrónica
Analizando JSON desde transmisiones
Si el contenido JSON se transmite a través de la red, debe usar un analizador JSON de transmisión. De lo contrario, atará su procesador y estrangulará su bucle de eventos hasta que el contenido JSON se transmita por completo.
Hay muchos paquetes disponibles en NPM para esto. Elige lo que sea mejor para ti.
Manejo de errores / seguridad
Si no está seguro de si lo que se le pasa
JSON.parse()
es JSON válido , asegúrese de encerrar la llamadaJSON.parse()
dentro de untry/catch
bloque. Una cadena JSON proporcionada por el usuario podría bloquear su aplicación e incluso podría generar agujeros de seguridad. Asegúrese de que el manejo de errores se realiza si analiza JSON proporcionado externamente.fuente
and could even lead to security holes
por curiosidad, ¿cómo?<script>...
, y el error se derramó en el lado del cliente, tiene un error XSS allí mismo. Por lo tanto, es importante manejar los errores JSON justo donde lo analiza.require
para incluir a JSON?" y ni siquiera se molestó en documentar los efectos secundarios. Esto también significa que requiere aceptar archivos en dos idiomas: JavaScript y JSON (no, no son lo mismo). Demasiado para SRP.usa el objeto JSON :
fuente
Otro ejemplo de JSON.parse:
fuente
Me gustaría mencionar que hay alternativas al objeto JSON global.
JSON.parse
yJSON.stringify
ambos son síncronos, por lo que si desea tratar con objetos grandes, es posible que desee consultar algunos de los módulos JSON asíncronos.Echa un vistazo: https://github.com/joyent/node/wiki/Modules#wiki-parsers-json
fuente
JSON.parse
toda la aplicación analiza el JSON con formato incorrecto, se bloqueará o, al usarloprocess.on('uncaughtException', function(err) { ... });
, eventualmente no habrá posibilidad de enviar un error de "JSON con formato incorrecto" al usuario.async
analizador sintáctico? No lo encontré.Incluye la
node-fs
biblioteca.Para obtener más información sobre la biblioteca 'fs', consulte la documentación en http://nodejs.org/api/fs.html
fuente
Como no sabe que su cadena es realmente válida, la pondría primero en un intento de captura. Además, dado que los bloques try catch no están optimizados por nodo, pondría todo en otra función:
O en "estilo asíncrono"
fuente
Analizando una secuencia JSON? Uso
JSONStream
.https://github.com/dominictarr/JSONStream
fuente
Todo el mundo aquí ha contado sobre JSON.parse, así que pensé en decir algo más. Hay un gran módulo Conéctese con muchos middleware para hacer que el desarrollo de aplicaciones sea más fácil y mejor. Uno de los middleware es bodyParser . Analiza JSON, formularios html, etc. También hay un middleware específico para JSON que analiza solo noop .
Eche un vistazo a los enlaces de arriba, podría ser realmente útil para usted.
fuente
Eso es todo.
fuente
Como han mencionado otras respuestas aquí, probablemente desee solicitar un archivo json local que sepa que es seguro y presente, como un archivo de configuración:
o para usar el objeto JSON global para analizar un valor de cadena en un objeto:
tenga en cuenta que cuando necesita un archivo, se evalúa el contenido de ese archivo, lo que introduce un riesgo de seguridad en caso de que no sea un archivo json sino un archivo js.
aquí, publiqué una demostración en la que puede ver ambos métodos y jugar con ellos en línea (el ejemplo de análisis está en el archivo app.js, luego haga clic en el botón Ejecutar y vea el resultado en el terminal): http: // staging1 .codefresh.io / labs / api / env / json-parse-example
puedes modificar el código y ver el impacto ...
fuente
¿Usa JSON para su configuración con Node.js? Lea esto y obtenga sus habilidades de configuración por encima de 9000 ...
Las aplicaciones adecuadas vienen en más de 3 capas de configuración:
La mayoría de los desarrolladores tratan la configuración de su servidor y aplicación como si pudiera cambiar. No puede Puede superponer cambios de capas superiores una encima de otra, pero está modificando los requisitos básicos . ¡Algunas cosas necesitan existir! Haga que su configuración actúe como si fuera inmutable, porque parte de ella básicamente lo es, al igual que su código fuente.
No ver que muchas de sus cosas no van a cambiar después del inicio conduce a antipatrones como ensuciar su carga de configuración con bloques try / catch y pretender que puede continuar sin su aplicación de configuración adecuada. No puedes Si puede, eso pertenece a la capa de configuración de comunidad / usuario, no a la capa de configuración de servidor / aplicación. Solo lo estás haciendo mal. Las cosas opcionales deben colocarse en capas en la parte superior cuando la aplicación finalice su arranque.
Deja de golpearte la cabeza contra la pared: tu configuración debe ser ultra simple .
Eche un vistazo a lo fácil que es configurar algo tan complejo como un marco de servicio independiente del protocolo y del origen de datos utilizando un archivo de configuración json simple y un archivo app.js simple ...
container-config.js ...
index.js ... (el motor que impulsa todo)
app.js ... (el código que impulsa su servicio independiente de protocolo y fuente de datos)
Con este patrón, ahora puede cargar cosas de configuración de la comunidad y del usuario en la parte superior de su aplicación arrancada, las operaciones de desarrollo están listas para llevar su trabajo a un contenedor y escalarlo. Estás leído para multiempresa. Userland está aislado. Ahora puede separar las preocupaciones de qué protocolo de servicio está usando, qué tipo de base de datos está usando, y simplemente centrarse en escribir un buen código.
Debido a que está utilizando capas, puede confiar en una única fuente de verdad para todo, en cualquier momento (el objeto de configuración en capas) y evitar verificaciones de errores en cada paso, preocupándose por "oh mierda, ¿cómo voy a hacer esto? funciona sin la configuración adecuada?!? ".
fuente
Mi solución:
fuente
TypeError: path must be a string or Buffer
errores. ¿ Alguna idea de dónde comenzar a depurar este problema?Solo quiero completar la respuesta (mientras luché con ella por un tiempo), quiero mostrar cómo acceder a la información json, este ejemplo muestra cómo acceder a Json Array:
fuente
Solo para hacer esto lo más complicado posible, y traer tantos paquetes como sea posible ...
Esto te permite hacer:
O si está utilizando async / await:
La ventaja sobre el uso
readFileSync
es que su servidor Node puede procesar otras solicitudes mientras el archivo se lee desde el disco.fuente
JSON.parse no garantizará la seguridad de la cadena json que está analizando. Debería mirar una biblioteca como json-safe-parse o una biblioteca similar.
Desde la página nson json-safe-parse:
fuente
Aproveche la función de intento de Lodash para devolver un objeto de error, que puede manejar con la función isError.
fuente
.bind
lugar de simplemente usar _.attempt (JSON.parse, str)Siempre asegúrese de usar JSON.parse en try catch block ya que el nodo siempre arroja un Error inesperado si tiene algunos datos corruptos en su json, así que use este código en lugar de JSON.Parse simple
fuente
Si desea agregar algunos comentarios en su JSON y permitir las comas finales, puede usar la siguiente implementación:
Tenga en cuenta que podría no funcionar bien si tiene algo como
"abc": "foo // bar"
en su JSON. Entonces YMMV.fuente
Si el archivo fuente JSON es bastante grande, puede considerar la ruta asincrónica a través del enfoque asíncrono / espera nativo con Node.js 8.0 de la siguiente manera
fuente
Yo uso fs-extra . Me gusta mucho porque, aunque admite devoluciones de llamada, también admite Promesas . Entonces solo me permite escribir mi código de una manera mucho más legible:
También tiene muchos métodos útiles que no vienen junto con el
fs
módulo estándar y , además de eso, tambiénfs
une los métodos del módulo nativo y los promete.Así que básicamente son todas las ventajas. Espero que otros encuentren esto útil.
fuente
Si necesita analizar JSON con Node.js de forma segura (también conocido como: el usuario puede ingresar datos o una API pública), sugeriría usar secure-json-parse .
El uso es el predeterminado,
JSON.parse
pero protegerá su código de:fuente
Puede usar JSON.parse () (que es una función integrada que probablemente lo obligará a envolverlo con declaraciones try-catch).
O utilice alguna biblioteca npm de análisis JSON, algo como json-parse-or
fuente
Use esto para estar seguro
fuente
NodeJs es un servidor basado en JavaScript , por lo que puede hacer lo que hace en JavaScript puro ...
Imagina que tienes este Json en NodeJs ...
Y puede hacer lo anterior para obtener una versión analizada de su json ...
fuente
Como se menciona en las respuestas anteriores, podemos usar
JSON.parse()
para analizar las cadenas a JSON. Pero antes de analizar, asegúrese de analizar los datos correctos o de lo contrario podría hacer que su aplicación se caiga.es seguro usarlo así
fuente
Uso
JSON.parse(str);
. Lea más sobre esto aquí .Aquí hay unos ejemplos:
fuente
No se necesitan más módulos.
Simplemente use
var parsedObj = JSON.parse(yourObj);
No creo que haya problemas de seguridad con respecto a esto
fuente
Es simple, puede convertir JSON a cadena usando
JSON.stringify(json_obj)
, y convertir cadena a JSON usandoJSON.parse("your json string")
.fuente