Escribir JSON formateado en Node.js

81

Estoy usando Node.js para PUBLICAR JSON en PostBin, pero los datos están formateados incorrectamente (como puede ver aquí: http://www.postbin.org/1cpndqw ).

Este es el código que estoy usando para probar:

var http = require('http');

var options = {
  host: 'www.postbin.org',
  port: 80,
  path: '/1cpndqw',
  method: 'POST'
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.write(JSON.stringify({ a:1, b:2, c:3 }, null, 4));
req.end();
Donald
fuente
{"a":1,"b":2,"c":3}¿solucionaste tu problema? Parece que publicaste los datos correctamente.
Raynos
Los datos son correctos pero "feos", quiero enviarlos así, más fácil de entender: postbin.org/1ijyltn#xa6rim
donald

Respuestas:

10

Bueno, principalmente porque a JSON no le importa cómo está formateado, y tú mismo no estás formateando. Lo que necesitas es una prettyprinter javascript, si te importa, pero la primera pregunta es "¿Por qué te importa?"

Aquí hay un código bastante impreso de las recetas de Javascript.

En realidad, hay un montón de ejemplos diferentes aquí en SO.

ACTUALIZAR

Bien, ahora está haciendo lo que quieres, preguntémonos si estás haciendo lo correcto. Como han señalado varias personas, no es necesario transmitir esas nuevas líneas, pestañas o espacios adicionales; el costo de eficiencia es pequeño, probablemente en el vecindario del 2 al 5 por ciento, pero nunca se sabe cuándo podría necesitar un par por ciento.

Por otro lado, estoy completamente de acuerdo en que es mucho más conveniente poder leer la salida JSON como texto bastante impreso. Pero hay otra solución: probablemente todavía esté usando un navegador para ver estos resultados, por lo que en lugar de imprimirlos para transmitirlos, use una impresora bonita del lado del cliente. Utilizo JSONView para Chrome y JSONView en Firefox. Muchos depuradores también imprimirán bastante los resultados JSON por usted.

Charlie martin
fuente
Para fines de transmisión, no desea enviar / recibir datos de formato adicionales. El JSON con espacio en blanco adicional no significa nada diferente para la máquina ... solo le importa a un humano que necesita entenderlo. Idealmente, solo desea imprimirlo con un aspecto bonito cuando realmente tenga una persona que necesite mirarlo.
entropo
@donald, ¿por qué te importa cómo se ve? JSON son datos sin procesar. No te preocupas por los espacios en blanco.
Raynos
Funcionó como: console.log (JSON.stringify ({a: 1, b: 2, c: 3}, null, '\ t')); en la consola, pero aún así, PostBin no lo hace bien. ¿Quizás es su problema?
donald
348

Utilice JSON.stringify(object, null, 4)donde 4es el número de espacios a utilizar como unidad de sangría. También puede utilizar "\t"si desea pestañas. En realidad, esto es parte de la especificación ECMAScript 5 y está documentado en MDN .

Peter Lyons
fuente
3
¡Wow gracias! Me pregunto por qué esto ya no está documentado. Supuse que no estaba disponible.
mrjf
Sí, es extraño. ¿Quizás está en camino a la desaprobación o algo así? ¿Solo un descuido de la documentación? No estoy seguro.
Peter Lyons
6
@PeterLyons, esto está en la especificación ECMAScript 5. Tal vez simplemente no tenían ganas de documentar cosas que no eran específicas de un nodo.
Matthew Flaschen
FWIW, esto parece estar documentado esencialmente en todas partes, y no parece ser específico de un nodo, a partir de ahora.
Dave Newton
6

Usé un proceso de dos pasos que encontré que funcionaba:

var output = JSON.parse(insert_json_here);
var print_to_file = JSON.stringify(output, null, "\t")
Fritz Dodoo
fuente
2

Debería consultar el subrayado-cli : es una herramienta de línea de comandos para inspeccionar y procesar datos JSON.

Dave Dopson
fuente