2011-04-17 18 views
78

Sto utilizzando Node.js per POST JSON per PostBin ma i dati vengono formattati in modo errato (come puoi vedere qui: http://www.postbin.org/1cpndqw).Scrivi JSON formattato in Node.js

Questo è il codice che sto utilizzando per il test:

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(); 
+0

'{ "a": 1, "b": 2, "c": 3}' hai fatto a risolvere il problema? Sembra che tu abbia inserito correttamente i dati. – Raynos

+0

I dati sono corretti ma "brutti", voglio inviare in questo modo, più facile da capire: http://www.postbin.org/1ijyltn#xa6rim – donald

risposta

9

Beh, in primo luogo perché JSON non interessa come è formattato, e non si è nessun tipo di formattazione da soli. Quello che ti serve è una stampante carina per javascript, se ti interessa, ma la prima domanda è "Perché ti importa?"

Ecco un codice prettyprinting dalle Ricette Javascript.

In realtà ci sono un sacco di esempi diversi here su SO.

UPDATE

Bene, ora che sta facendo quello che vuoi, chiediamo se stai facendo la cosa giusta. Come molte persone hanno sottolineato, non è necessario trasmettere quelle nuove righe e tabulazioni, o spazi; il costo dell'efficienza è basso, probabilmente intorno al 2-5 percento, ma non si sa mai quando potrebbe essere necessario un paio di percento.

D'altra parte, sono completamente d'accordo sul fatto che sia molto più comodo essere in grado di leggere l'output JSON come testo piuttosto stampato. Ma c'è un'altra soluzione: probabilmente stai ancora utilizzando un browser per vedere questi risultati, quindi invece di eseguirne la stampa per la trasmissione, usa una stampante pretty-client. Io uso JSONView for Chrome e JSONView in Firefox. Molti debugger eseguiranno anche la stampa dei risultati JSON.

+0

Voglio ottenere qualcosa di simile a questo: http: //www.postbin .org/1ijyltn # xa6rim – donald

+0

Ai fini della trasmissione, non si desidera inviare/ricevere i dati di formattazione aggiuntivi. Il JSON con spazi bianchi extra non ha nulla di diverso dalla macchina ... è importante per un umano che ha bisogno di capirlo. Idealmente, vuoi solo stamparlo graziosamente quando hai effettivamente una persona che ha bisogno di guardarlo. – entropo

+0

@donald perché ti importa di come appare? JSON è dati non elaborati. Non ti importa degli spazi bianchi. – Raynos

2

Si consiglia di verificare underscore-cli - è uno strumento da riga di comando per l'ispezione e l'elaborazione dei dati JSON.

344

Utilizzare JSON.stringify(object, null, 4) dove 4 è il numero di spazi da utilizzare come unità di indentazione. È inoltre possibile utilizzare "\t" se si desidera schede. Questo è in realtà part of the ECMAScript 5 specification ed è documented on MDN.

+2

Wow, grazie! Mi chiedo perché questo non è più documentato. Ho pensato che non fosse disponibile. – mrjf

+0

Sì, è strano. Forse è sulla strada della deprecazione o qualcosa del genere? Solo una supervisione della documentazione? Non sono sicuro. –

+6

@PeterLyons, questo è nella specifica ECMAScript 5. Forse non avevano proprio voglia di documentare cose che non erano specifiche del nodo. –

5

ho usato una procedura passo a due che ho trovato a lavorare:

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