Viết JSON được định dạng trong Node.js


81

Tôi đang sử dụng Node.js để ĐĂNG JSON lên PostBin nhưng dữ liệu đang được định dạng sai (như bạn có thể thấy ở đây: http://www.postbin.org/1cpndqw ).

Đây là mã tôi đang sử dụng cho 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();

{"a":1,"b":2,"c":3}bạn đã khắc phục sự cố của bạn? Có vẻ như bạn đã đăng đúng dữ liệu.
Raynos

Dữ liệu đúng nhưng "xấu xí", tôi muốn gửi như thế này, dễ hiểu hơn: postbin.org/1ijyltn#xa6rim
donald

Câu trả lời:


10

Chà, chủ yếu là vì JSON không quan tâm nó được định dạng như thế nào và bạn không tự mình thực hiện bất kỳ định dạng nào. Những gì bạn cần là một trình duyệt javascript, nếu bạn quan tâm, nhưng câu hỏi đầu tiên là "Tại sao bạn quan tâm?"

Đây là một đoạn mã đẹp đẽ từ Javascript Recipes.

Trên thực tế, có rất nhiều ví dụ khác nhau ở đây trên SO.

CẬP NHẬT

Được rồi, vậy bây giờ nó đang làm những gì bạn muốn, hãy hỏi xem bạn có đang làm đúng không. Như một số người đã chỉ ra, bạn không cần phải truyền thêm những dòng mới và tab, hoặc dấu cách; chi phí hiệu quả là nhỏ, có thể trong khoảng 2-5 phần trăm, nhưng bạn không bao giờ biết khi nào bạn có thể cần một vài phần trăm.

Mặt khác, tôi hoàn toàn đồng ý rằng sẽ thuận tiện hơn rất nhiều khi có thể đọc đầu ra JSON dưới dạng văn bản in đẹp. Nhưng có một giải pháp khác - có thể bạn vẫn đang sử dụng trình duyệt để xem các kết quả này, vì vậy thay vì in ảnh đẹp để truyền tải, hãy sử dụng trình duyệt xinh xắn phía máy khách. Tôi sử dụng JSONView cho ChromeJSONView trong Firefox. Nhiều trình gỡ lỗi cũng sẽ in kết quả JSON cho bạn.


Đối với mục đích truyền tải, bạn không muốn gửi / nhận dữ liệu định dạng bổ sung. JSON có thêm khoảng trắng có nghĩa là không có gì khác biệt đối với máy ... nó chỉ quan trọng đối với con người cần hiểu nó. Tốt nhất, bạn chỉ muốn in nó đẹp khi bạn thực sự có người cần xem nó.
entropo

@donald tại sao bạn quan tâm đến nó trông như thế nào? JSON là dữ liệu thô. Bạn không quan tâm đến khoảng trắng.
Raynos

CNTT hoạt động như: console.log (JSON.stringify ({a: 1, b: 2, c: 3}, null, '\ t')); trong bảng điều khiển, nhưng PostBin vẫn chưa thực hiện đúng. Có lẽ đó là vấn đề của họ?
donald


348

Sử dụng JSON.stringify(object, null, 4)trong đó 4là số lượng khoảng trắng được sử dụng làm đơn vị thụt lề. Bạn cũng có thể sử dụng "\t"nếu bạn muốn các tab. Đây thực sự là một phần của đặc tả ECMAScript 5 và được ghi lại trên MDN .


3
Ồ cảm ơn nhé! Tôi tự hỏi tại sao điều này không được ghi lại nữa. Tôi cho rằng nó không có sẵn.
mrjf

Ừ, thật kỳ lạ. Có thể nó đang trên con đường không còn được dùng nữa hay sao? Chỉ là một giám sát tài liệu? Không chắc.
Peter Lyons

6
@PeterLyons, đây là thông số kỹ thuật của ECMAScript 5. Có lẽ họ không cảm thấy thích ghi lại những thứ không phải là nút cụ thể.
Matthew Flaschen

FWIW, điều này dường như được ghi nhận về cơ bản ở khắp mọi nơi và dường như không dành riêng cho Node, kể từ bây giờ.
Dave Newton

6

Tôi đã sử dụng quy trình hai bước mà tôi thấy có hiệu quả:

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

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.