Làm cách nào tôi có thể in JSON đẹp bằng node.js?


435

Điều này có vẻ như là một vấn đề được giải quyết nhưng tôi không thể tìm ra giải pháp cho nó.

Về cơ bản, tôi đọc một tệp JSON, thay đổi một khóa và viết lại JSON mới vào cùng một tệp. Tất cả đều hoạt động, nhưng tôi mất định dạng JSON. Vì vậy, thay vì:

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

tôi có

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

Có cách nào trong Node.js để viết JSON được định dạng tốt vào tệp không?


JSON.stringifycuộn cảm trên các đối tượng tuần hoàn và util.inspectkhông tạo ra json hợp lệ. : \ Tôi không tìm thấy giải pháp [bản địa] nào để in JSON đẹp trong NodeJS
ThorSummoner

@ThorSummoner: Đó là một vấn đề với JSON, không phải với Node JSON JSON không hỗ trợ các tham chiếu theo chu kỳ. Có một giải pháp ở đây, trong một câu hỏi khác .
Sasha Chedygov

Câu trả lời:


813

JSON.stringifyTham số thứ ba xác định chèn khoảng trắng cho in ấn đẹp. Nó có thể là một chuỗi hoặc một số (số khoảng trắng). Nút có thể ghi vào hệ thống tập tin của bạn với fs. Thí dụ:

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

Xem tài liệu JSON.opesify () tại MDN , tài liệu Node fs


1
Lưu ý: thay vì 4, sử dụng "\t"nếu bạn muốn các tab.
Jeremy Thille

Trong các nút mới nhất, bạn cần cung cấp hàm gọi lại làm tham số thứ ba, xem câu trả lời sau: stackoverflow.com/a/11677276/675065
Alp

216

Tôi nghĩ rằng điều này có thể hữu ích ... Tôi thích mã ví dụ :)

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

3
Hãy chắc chắn rằng tmpthư mục tồn tại nếu không điều này có thể thất bại.
Trận chiến

2
trong hầu hết các hệ thống unix (bao gồm Mac & Linux..và nếu tôi nhớ BSD), tmpthư mục tồn tại theo mặc định
Antony

vị trí (tên tệp đầu ra) sẽ được cung cấp trong trường hợp cửa sổ
Devrath

Tôi không biết tại sao tệp của mình không được ghi (chỉ mở trống) mà không có cuộc gọi lại ... Hoặc có thể nó không đồng bộ và nó không hoạt động vì tôi bị ném ngoại lệ khi khởi động ứng dụng?
Tomasz Gandor

1
Cảm ơn, nó đã giúp tôi rất nhiều.
Suraj Jain

83

Nếu bạn chỉ muốn in đẹp một đối tượng và không xuất nó dưới dạng JSON hợp lệ, bạn có thể sử dụng console.dir().

Nó sử dụng làm nổi bật cú pháp, thụt lề thông minh, xóa dấu ngoặc kép khỏi các phím và chỉ làm cho đầu ra đẹp như mong muốn.

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

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

Ảnh chụp màn hình của đối tượng đã đăng nhập

Dưới mui xe nó là một phím tắt cho console.log(util.inspect(…)). Sự khác biệt duy nhất là nó bỏ qua bất kỳ inspect()chức năng tùy chỉnh nào được xác định trên một đối tượng.


8
console.dir không tạo ra json hợp lệ.
Gregg Lind

1
@GreggLind Làm rõ rằng trong câu trả lời!
adius

Điều này làm cho máy chủ tốc hành của tôi bị đình trệ. Tôi không biết tại sao :(
Sanket Berde

34

Nếu bạn không muốn lưu trữ bất cứ nơi nào, nhưng chỉ xem đối tượng cho mục đích gỡ lỗi.

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

Bạn có thể thay đổi tham số thứ ba để điều chỉnh thụt lề.


1
Tôi đã tìm kiếm giải pháp này giống như mãi mãi! Các param cuối cùng hoạt động như một nét duyên dáng!
vt2424253

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.