พิมพ์ JSON แยกวิเคราะห์วัตถุ?


200

ฉันมีวัตถุจาวาสคริปต์ซึ่งมีการแยกวิเคราะห์ JSON โดยใช้JSON.parseตอนนี้ฉันต้องการพิมพ์วัตถุเพื่อให้ฉันสามารถดีบักได้ (มีบางอย่างผิดปกติกับฟังก์ชัน) เมื่อฉันทำต่อไปนี้ ...

for (property in obj) {
    output += property + ': ' + obj[property]+'; ';
}
console.log(output);

ฉันได้รับการระบุไว้ใน [object Object] หลายรายการ ฉันสงสัยว่าฉันจะพิมพ์สิ่งนี้เพื่อดูเนื้อหาได้อย่างไร


5
ในฐานะ sidenote สำหรับ (property ใน obj) จะแสดงรายการคุณสมบัติทั้งหมดแม้กระทั่งรายการที่สืบทอด ดังนั้นคุณจะได้รับสิทธิพิเศษมากมายสำหรับ Object.prototype และ 'คลาสแม่' นี่ไม่สะดวกกับวัตถุ json คุณต้องกรองพวกเขาด้วย hasOwnProperty () เพื่อรับเฉพาะคุณสมบัติที่วัตถุนี้เป็นเจ้าของ
BiAiB

คำตอบ:


124

คอนโซลดีบักเกอร์ส่วนใหญ่รองรับการแสดงวัตถุโดยตรง เพียงแค่ใช้

console.log(obj);

ขึ้นอยู่กับดีบักเกอร์ของคุณซึ่งส่วนใหญ่จะแสดงวัตถุในคอนโซลเป็นแผนผังที่ยุบ คุณสามารถเปิดต้นไม้และตรวจสอบวัตถุ


122
เป็นมูลค่าการกล่าวขวัญว่าในโครม (และเบราว์เซอร์อื่น ๆ ) เมื่อรวมกับสตริงเช่นนี้console.log("object: " + obj)มันไม่แสดงวัตถุ แต่จะส่งออก "วัตถุ: [Object obj]"
Shahar

24
@Shahar console.log("object: %O", obj)(Chrome) หรือ console.log("object: %o", obj)(Firefox | Safari) จะช่วยให้คุณสามารถเข้าถึงรายละเอียดของวัตถุได้โปรดดูคำตอบของฉันด้านล่าง
เดฟแอนเดอร์สัน

1
@DaveAnderson ยิงได้ดีสำหรับการจัดรูปแบบวัตถุในคอนโซล
lekant

@Shahar ขอบคุณคุณเป็นข้อมูลที่ฉันต้องการ ควรเพิ่มคำตอบลงไป
Leo Flaherty

3
นอกจากวิธีการของ @DaveAnderson แล้วการใช้เครื่องหมายจุลภาคเพื่อแยกสตริงออกจากวัตถุยังสามารถทำงานได้:console.log("My object: ", obj)
Shahar

571

คุณรู้ว่า JSON หมายถึงอะไร JavaScript Object สัญลักษณ์ มันทำให้รูปแบบที่ดีสำหรับวัตถุ

JSON.stringify(obj) จะให้กลับมาเป็นตัวแทนสตริงของวัตถุ


12
ฉันประหลาดใจที่คำตอบนี้อยู่ด้านล่าง ...... นี่ควรเป็นคำตอบที่ยอมรับได้ :-)
Mingyu

1
ถ้าคุณไม่ต้องการให้ตัวแทนสตริง แต่วัตถุที่มันจะปรากฏในการแก้ไขรหัส?
SuperUberDuper

5
@SuperUberDuper: ... แล้วคุณจะไม่พยายามสร้างการแสดงสตริงตอนนี้คุณต้องการ :)
cHao

ฉันเชื่อว่า SuperUberDuper กำลังถามว่าวัตถุสามารถบันทึกหรือดูได้โดยไม่แปลงเป็นสตริง หากการดูในเบราว์เซอร์ DOM ต้องการองค์ประกอบคุณสามารถทำให้ json เป็นสตริงและตั้งค่าเนื้อหาองค์ประกอบ innerHTML เป็นสตริงนั้นเพื่อดูบนหน้า
jasonleonhard

ตัวอย่างเช่น: นำเข้า Json จาก './data.json'; var el = document.createElement ('div'); el.innerHTML = JSON.stringify (Json);
jasonleonhard

54

ลองconsole.dir()แทนconsole.log()

console.dir(obj);

MDNพูดว่าconsole.dir()ได้รับการสนับสนุนโดย:

  • FF8 +
  • IE9 +
  • อุปรากร
  • โครเมียม
  • การแข่งรถวิบาก

1
มีเฉพาะใน IE9 +
jasonscript

3
console.dir()มีให้บริการใน FF8 +, Opera, Chrome และ Safari: developer.mozilla.org/en-US/docs/Web/API/console.dir
olibre

ที่ดี! นี่เป็นทางออกที่ดีที่สุดสำหรับฉัน ขอบคุณ
Hoang Le

1
แล้วโหนด js ล่ะ?
Xsmael

ดี แต่ไม่สนับสนุนการต่อข้อมูลสตริงเช่นล็อก ("สตริง" + ตัวแปร)
Nassim

47

หากคุณต้องการ JSON ที่สวย, หลายบรรทัดพร้อมการเยื้องคุณสามารถใช้JSON.stringifyกับอาร์กิวเมนต์ที่ 3:

JSON.stringify(value[, replacer[, space]])

ตัวอย่างเช่น:

var obj = {a:1,b:2,c:{d:3, e:4}};

JSON.stringify(obj, null, "    ");

หรือ

JSON.stringify(obj, null, 4);

จะให้ผลลัพธ์ดังนี้:

"{
    "a": 1,
    "b": 2,
    "c": {
        "d": 3,
        "e": 4
    }
}"

ในเบราว์เซอร์ทำงานconsole.log(obj)ได้ดียิ่งขึ้น แต่ในเชลล์คอนโซล (node.js) ไม่ทำงาน


40

เพื่อพิมพ์ JSON แยกวิเคราะห์วัตถุเพียงพิมพ์

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

และคุณจะได้รับผลลัพธ์ที่ชัดเจนมาก


25

ใช้รูปแบบสตริง

console.log("%s %O", "My Object", obj);

Chrome มีตัวระบุรูปแบบดังนี้:

  • %s จัดรูปแบบค่าเป็นสตริง
  • %dหรือจัด%iรูปแบบค่าเป็นจำนวนเต็ม
  • %f จัดรูปแบบค่าเป็นค่าทศนิยม
  • %o จัดรูปแบบค่าเป็นองค์ประกอบ DOM ที่ขยายได้ (เช่นในแผงองค์ประกอบ)
  • %O จัดรูปแบบค่าเป็นวัตถุ JavaScript ที่ขยายได้
  • %c จัดรูปแบบสตริงเอาต์พุตตามสไตล์ CSS ที่คุณระบุ

Firefox ยังมีสตริงย่อยซึ่งมีตัวเลือกที่คล้ายกัน

  • %oส่งออกเชื่อมโยงหลายมิติไปยังวัตถุ JavaScript การคลิกที่ลิงค์จะเปิดตัวตรวจสอบ
  • %dหรือส่ง%iออกจำนวนเต็ม ยังไม่รองรับการฟอร์แมต
  • %s ส่งออกสตริง
  • %fส่งออกค่าทศนิยม ยังไม่รองรับการฟอร์แมต

Safari มีฟอร์แมทสไตล์ printf

  • %dหรือ%iจำนวนเต็ม
  • %[0.N]f ค่าจุดลอยตัวที่มีความแม่นยำ N ตัว
  • %o วัตถุ
  • %s เชือก

1
คำตอบอ้างอิงที่ดี
David

1
% O มีประโยชน์จริง ๆ
everton

4

ดีและเรียบง่าย:

console.log("object: %O", obj)

1
คุณช่วยอธิบายให้% O ทำอะไรได้บ้าง มันควรเป็น O โดยเฉพาะหรือไม่? - โซลูชันของคุณทำงานอย่างมีเสน่ห์
Anthonius

O ย่อมาจากอ็อปเจ็กดังนั้นตราบใดที่ออบเจกต์สามารถพิมพ์เป็นสตริงได้ก็ควรพิมพ์โดยไม่มีปัญหา สิ่งนี้ช่วยฉันแก้ไขปัญหาในหลายกรณีที่ฉันไม่แน่ใจว่าข้อผิดพลาดอยู่
ที่ไหน

ฉันลืมแจ้งที่นี่จริง ๆ แล้วเราไม่จำเป็นต้องใช้% O เราสามารถใช้ console.log โดยตรง ("object:", obj) ขอบคุณ @mbenhalima
Anthonius

3

เพียงแค่ใช้

console.info("CONSOLE LOG : ")
console.log(response);
console.info("CONSOLE DIR : ")
console.dir(response);

และคุณจะได้รับสิ่งนี้ในคอนโซลโครเมี่ยม:

CONSOLE LOG : 
facebookSDK_JS.html:56 Object {name: "Diego Matos", id: "10155988777540434"}
facebookSDK_JS.html:57 CONSOLE DIR : 
facebookSDK_JS.html:58 Objectid: "10155988777540434"name: "Diego Matos"__proto__: Object

2

ฟังก์ชั่นที่เรียบง่ายเพื่อแจ้งเตือนเนื้อหาของวัตถุหรืออาร์เรย์
เรียกใช้ฟังก์ชันนี้ด้วยอาร์เรย์หรือสตริงหรือวัตถุที่แจ้งเตือนเนื้อหา

ฟังก์ชัน

function print_r(printthis, returnoutput) {
    var output = '';

    if($.isArray(printthis) || typeof(printthis) == 'object') {
        for(var i in printthis) {
            output += i + ' : ' + print_r(printthis[i], true) + '\n';
        }
    }else {
        output += printthis;
    }
    if(returnoutput && returnoutput == true) {
        return output;
    }else {
        alert(output);
    }
}

การใช้

var data = [1, 2, 3, 4];
print_r(data);

2

รหัสต่อไปนี้จะแสดงข้อมูล json ที่สมบูรณ์ในกล่องแจ้งเตือน

var data= '{"employees":[' +
'{"firstName":"John","lastName":"Doe" },' +
'{"firstName":"Anna","lastName":"Smith" },' +
'{"firstName":"Peter","lastName":"Jones" }]}';

json = JSON.parse(data);
window.alert(JSON.stringify(json));

2

หากคุณต้องการแก้ปัญหาทำไมไม่ใช้ดีบักคอนโซล

window.console.debug(jsonObject);

0

หากคุณกำลังทำงานกับ js บนเซิร์ฟเวอร์พลศึกษาอีกนิดหน่อยจะไปไกล ... นี่คือ ppos ของฉัน (พิมพ์สวยบนเซิร์ฟเวอร์):

ppos = (object, space = 2) => JSON.stringify(object, null, space).split('\n').forEach(s => console.log(s));

ซึ่งทำงานบางอย่างของการสร้างสิ่งที่ฉันสามารถอ่านจริงเมื่อฉันเขียนรหัสเซิร์ฟเวอร์


0

ฉันไม่ทราบวิธีที่ไม่เคยทำอย่างเป็นทางการแต่ฉันได้เพิ่มjsonวิธีการของฉันเองเพื่อconsoleคัดค้านการพิมพ์บันทึกสตริงที่ง่ายขึ้น:

การสังเกตวัตถุ (ไม่ใช่แบบดั้งเดิม) ในจาวาสคริปต์เป็นบิตเช่นกลศาสตร์ควอนตัม .. สิ่งที่คุณ"วัด"อาจไม่ใช่รัฐจริงซึ่งมีการเปลี่ยนแปลงแล้ว

console.json = console.json || function(argument){
    for(var arg=0; arg < arguments.length; ++arg)
        console.log(  JSON.stringify(arguments[arg], null, 4)  )
}

// use example
console.json(   [1,'a', null, {a:1}], {a:[1,2]}    )

หลายครั้งที่จำเป็นต้องใช้เพื่อดูรุ่นที่เป็นวัตถุของวัตถุเนื่องจากการพิมพ์ตามที่เป็น (วัตถุดิบ) จะพิมพ์รุ่น "สด" ของวัตถุที่ได้รับการกลายพันธุ์เป็นโปรแกรมดำเนินการและจะไม่สะท้อนสถานะของวัตถุ ที่จุดเวลาเข้าสู่ระบบตัวอย่างเช่น:

var foo = {a:1, b:[1,2,3]}

// lets peek under the hood
console.log(foo) 

// program keeps doing things which affect the observed object
foo.a = 2
foo.b = null
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.