Jak mogę ładnie wydrukować JSON za pomocą node.js?


436

Wydaje się, że to rozwiązany problem, ale nie jestem w stanie znaleźć rozwiązania.

Zasadniczo czytam plik JSON, zmieniam klucz i zapisuję nowy JSON w tym samym pliku. Wszystko działa, ale tracę formatowanie JSON, więc zamiast:

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

dostaję

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

Czy w Node.js jest sposób na zapisanie dobrze sformatowanego JSON do pliku?


JSON.stringifydusi się na obiektach cyklicznych i util.inspectnie wytwarza prawidłowego JSona. : \ Nie znalazłem [natywnego] rozwiązania ładnego drukowania JSON w NodeJS
ThorSummoner

@ThorSummoner: To jest problem z JSON, nie z Węzłem - JSON natywnie nie obsługuje cyklicznych odwołań. Tutaj jest rozwiązanie , w innym pytaniu .
Sasha Chedygov

Odpowiedzi:


814

JSON.stringifyTrzeci parametr określa wstawianie białych znaków do ładnego drukowania. Może to być ciąg znaków lub liczba (liczba spacji). Węzeł może zapisywać do twojego systemu plików przy pomocy fs. Przykład:

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,
}
*/

Zobacz dokumenty JSON.stringify () w MDN , Dokumenty węzłów fs


1
Uwaga: zamiast 4 użyj, "\t"jeśli chcesz mieć zakładki.
Jeremy Thille,

W najnowszych nodejs musisz podać funkcję wywołania zwrotnego jako trzeci parametr, zobacz tę odpowiedź: stackoverflow.com/a/11677276/675065
Alp

216

Myślę, że to może być przydatne ... Uwielbiam przykładowy kod :)

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);
    }
}); 

4
Upewnij się, że tmpfolder istnieje, w przeciwnym razie może się nie powieść.
Larry Battle

2
w większości systemów uniksowych (w tym Mac i Linux..i jeśli pamiętam BSD) tmpfolder istnieje domyślnie
Antony

jaka jest lokalizacja (nazwa pliku wyjściowego), która ma być podana w przypadku systemu Windows
Devrath

Nie wiem, dlaczego mój plik nie został zapisany (po prostu otwarty pusty) bez wywołania zwrotnego ... A może jest asynchroniczny i nie działał, ponieważ został zgłoszony wyjątek podczas uruchamiania aplikacji?
Tomasz Gandor

1
Dzięki, bardzo mi pomogło.
Suraj Jain

83

Jeśli chcesz po prostu wydrukować obiekt i nie eksportować go jako prawidłowego JSON, którego możesz użyć console.dir().

Używa podświetlania składni, inteligentnego wcięcia, usuwa cudzysłowy z kluczy i sprawia, że ​​dane wyjściowe są tak ładne, jak to tylko możliwe.

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

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

Zrzut ekranu zarejestrowanego obiektu

Pod maską jest to skrót console.log(util.inspect(…)). Jedyną różnicą jest to, że omija ona dowolną niestandardową inspect()funkcję zdefiniowaną na obiekcie.


8
plik console.dir nie produkuje prawidłowego pliku Json.
Gregg Lind,

1
@GreggLind Wyjaśniło to w odpowiedzi!
adius

To spowodowało, że mój serwer ekspresowy przestał działać. Nie wiem dlaczego :(
Sanket Berde

34

Jeśli nie chcesz tego nigdzie przechowywać, wystarczy wyświetlić obiekt w celu debugowania.

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

Możesz zmienić trzeci parametr, aby dostosować wcięcie.


1
Szukałem tego rozwiązania - na zawsze! Ostatni parametr działa jak urok!
vt2424253

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.