¿Cómo puedo imprimir bastante JSON usando node.js?


436

Esto parece un problema resuelto, pero no puedo encontrar una solución.

Básicamente, leo un archivo JSON, cambio una clave y escribo el nuevo JSON en el mismo archivo. Todo funciona, pero pierdo el formato JSON. Entonces, en lugar de:

{
  name:'test',
  version:'1.0'
}

yo obtengo

{name:'test',version:'1.1'}

¿Hay alguna manera en Node.js para escribir JSON bien formateado en un archivo?


JSON.stringifyse ahoga en objetos cíclicos y util.inspectno produce json válidos. : \ No encontré una solución [nativa] para imprimir JSON en NodeJS
ThorSummoner

@ThorSummoner: Eso es un problema con JSON, no con Node; JSON no admite referencias cíclicas de forma nativa. Aquí hay una solución , en otra pregunta .
Sasha Chedygov

Respuestas:


816

JSON.stringifyEl tercer parámetro define la inserción de espacios en blanco para una impresión bonita. Puede ser una cadena o un número (número de espacios). Node puede escribir en su sistema de archivos con fs. Ejemplo:

var fs = require('fs');

fs.writeFile('test.json', JSON.stringify({ a:1, b:2, c:3 }, null, 4));
/* test.json:
{
     "a": 1,
     "b": 2,
     "c": 3,
}
*/

Vea los documentos JSON.stringify () en MDN , Nodo fs docs


1
Nota: en lugar de 4, úsalo "\t"si quieres pestañas.
Jeremy Thille

En los últimos nodejs, debe proporcionar una función de devolución de llamada como tercer parámetro, consulte esta respuesta: stackoverflow.com/a/11677276/675065
Alp

216

Creo que esto podría ser útil ... Me encanta el código de ejemplo :)

var fs = require('fs');

var myData = {
  name:'test',
  version:'1.0'
}

var outputFilename = '/tmp/my.json';

fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
    if(err) {
      console.log(err);
    } else {
      console.log("JSON saved to " + outputFilename);
    }
}); 

44
Asegúrese de que la tmpcarpeta existe o de lo contrario esto podría fallar.
Larry Battle

2
En la mayoría de los sistemas Unix (incluidos Mac y Linux ... y si recuerdo BSD), la tmpcarpeta existe por defecto
Antony

¿
Cuál

No sé por qué mi archivo no se escribió (solo se abrió vacío) sin la devolución de llamada ... ¿O tal vez es asíncrono, y no funcionó porque tuve una excepción lanzada durante el inicio de la aplicación?
Tomasz Gandor

1
Gracias, me ayudó mucho.
Suraj Jain

83

Si solo desea imprimir un objeto bonito y no exportarlo como JSON válido, puede usarlo console.dir().

Utiliza resaltado de sintaxis, sangría inteligente, elimina las comillas de las claves y simplemente hace que la salida sea lo más bonita posible.

const jsonString = `{"name":"John","color":"green",
                     "smoker":false,"id":7,"city":"Berlin"}`
const object = JSON.parse(jsonString)

console.dir(object, {depth: null, colors: true})

Captura de pantalla del objeto registrado

Debajo del capó es un atajo para console.log(util.inspect(…)). La única diferencia es que omite cualquier inspect()función personalizada definida en un objeto.


8
console.dir no produce json válidos.
Gregg Lind

1
@GreggLind aclaró que en la respuesta!
Adio

Esto hizo que mi servidor express se detuviera. No sé por qué :(
Sanket Berde

34

Si no desea almacenar esto en cualquier lugar, solo vea el objeto con fines de depuración.

console.log(JSON.stringify(object, null, "  "));

Puede cambiar el tercer parámetro para ajustar la sangría.


1
¡He estado buscando esta solución, como siempre! ¡El último parámetro funciona como un encanto!
vt2424253

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.