ฉันจะพิมพ์ 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 ที่ถูกต้อง : \ ฉันไม่พบวิธีแก้ปัญหา [native] ในการพิมพ์ JSON ใน NodeJS
ThorSummoner

@ThorSummoner: นั่นเป็นปัญหาของ JSON ไม่ใช่กับโหนด - JSON ไม่สนับสนุนการอ้างอิงแบบวนรอบ มีวิธีการแก้ปัญหาคือที่นี่ในคำถามอื่น
Sasha Chedygov

คำตอบ:


814

JSON.stringifyพารามิเตอร์ที่สามของคำจำกัดความหมายถึงการแทรก white-space สำหรับการพิมพ์แบบสวย สามารถเป็นสตริงหรือตัวเลข (จำนวนช่องว่าง) 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 docs


1
หมายเหตุ: แทนที่จะเป็น 4 ให้ใช้"\t"หากคุณต้องการแท็บ
Jeremy Thille

ใน nodejs ล่าสุดคุณต้องจัดเตรียมฟังก์ชันการเรียกกลับเป็นพารามิเตอร์ที่สามดูคำตอบนี้: stackoverflow.com/a/11677276/675065
อัล

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โฟลเดอร์นั้นมีอยู่มิฉะนั้นไฟล์นี้อาจล้มเหลว
Larry Battle

2
ในระบบยูนิกซ์ส่วนใหญ่ (รวมถึง Mac & Linux .. และถ้าฉันจำ BSD ได้) tmpโฟลเดอร์จะมีอยู่เป็นค่าเริ่มต้น
Antony

สถานที่ตั้ง (ชื่อไฟล์เอาท์พุท) ที่จะได้รับในกรณีของ Windows
อะไร

ฉันไม่ทราบสาเหตุที่ไฟล์ของฉันไม่ได้รับการเขียน (เพิ่งเปิดว่าง) โดยไม่ต้องโทรกลับ ... หรืออาจเป็น async และมันไม่ทำงานเพราะฉันมีข้อยกเว้นเกิดขึ้นระหว่างการเริ่มต้นแอป
Tomasz Gandor

1
ขอบคุณมันช่วยฉันได้มาก
Suraj Jain

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 ที่ถูกต้อง
Gregg Lind

1
@ GreggLind ชี้แจงว่าในคำตอบ!
adius

นี่เองที่ทำให้เซิร์ฟเวอร์ของฉันด่วน ฉันไม่รู้ว่าทำไม :(
Sanket Berde

34

หากคุณไม่ต้องการเก็บสิ่งนี้ไว้ที่ใดก็ได้ แต่เพียงแค่ดูวัตถุนั้นเพื่อการดีบัก

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

คุณสามารถเปลี่ยนพารามิเตอร์ที่สามเพื่อปรับการเยื้อง


1
ฉันกำลังมองหาวิธีนี้เหมือนเคย! param สุดท้ายทำงานเหมือนจับใจ!
vt2424253

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.