Як можна гарненько роздрукувати JSON за допомогою node.js?


436

Це здається вирішеною проблемою, але я не в змозі знайти її рішення.

В основному я читаю файл JSON, змінюю ключ і записую назад новий JSON в той самий файл. Все працює, але я втрачаю форматування JSON. Отже, замість:

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

я отримав

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

Чи є спосіб у Node.js написати добре відформатований JSON у файл?


JSON.stringifyзадихається від циклічних об'єктів і util.inspectне видає дійсного json. : \ Я не знайшов жодного [рідного] рішення для симпатичного друку JSON у NodeJS
ThorSummoner

@ThorSummoner: Це проблема з JSON, а не з Node - JSON не підтримує циклічні посилання. Тут є рішення , в іншому питанні .
Саша Чедигов

Відповіді:


814

JSON.stringifyТретій параметр визначає вставку пробілів для гарного друку. Це може бути рядок або число (кількість пробілів). Вузол може записувати у вашу файлову систему за допомогою fs. Приклад:

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

Дивіться документи JSON.stringify () в MDN , Node fs dok


1
Примітка: замість 4 використовуйте, "\t"якщо хочете, вкладки.
Джеремі Тілль

В останніх nodejs вам потрібно надати функцію зворотного дзвінка як третій параметр, дивіться цю відповідь: stackoverflow.com/a/11677276/675065
Alp

216

Я думаю, що це може бути корисним ... Я люблю приклад код :)

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
Переконайтесь, що tmpпапка існує, інакше це може вийти з ладу.
Битва Ларрі

2
у більшості систем Unix (включаючи Mac і Linux..і якщо я згадую BSD), tmpпапка за замовчуванням існує
Антоній

яке місце розташування (вихідне ім'я файлу) потрібно вказати у випадку Windows
Devrath

Я не знаю, чому мій файл не був записаний (просто відкритий порожнім) без зворотного дзвінка ... А може бути, це асинхронізація, і це не спрацювало, оскільки у мене був викид, викинутий під час запуску програми?
Томаш Гандор

1
Спасибі, мені це дуже допомогло.
Сурай Джайн

83

Якщо ви просто хочете красиво надрукувати об'єкт, а не експортувати його як дійсний JSON, ви можете використовувати console.dir().

Він використовує підсвічування синтаксису, розумний відступ, видаляє лапки з клавіш і просто робить результат таким же гарним, як і отримує.

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

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

Знімок екрана зареєстрованого об'єкта

Під капотом це ярлик для console.log(util.inspect(…)). Єдина відмінність полягає в тому, що він обходить будь-яку власну inspect()функцію, визначену на об'єкті.


8
console.dir не створює дійсний json.
Грегг Лінд

1
@GreggLind Уточнив це у відповіді!
adius

Це зробило мій експрес-сервер. Я не знаю, чому :(
Санкет Берде,

34

Якщо ви не хочете зберігати це де завгодно, а просто перегляньте об'єкт для налагодження.

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

Ви можете змінити третій параметр, щоб відрегулювати відступ.


1
Я шукав таке рішення, як завжди! Останній парам працює як шарм!
vt2424253

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.