การสนับสนุน JSON ของเบราว์เซอร์พื้นเมือง (window.JSON)


92

ฉันได้เห็นการอ้างอิงถึงเบราว์เซอร์บางตัวที่สนับสนุนการแยกวิเคราะห์ / การทำให้อนุกรมของวัตถุ JSON อย่างปลอดภัยและมีประสิทธิภาพผ่านทางwindow.JSONวัตถุ แต่รายละเอียดนั้นยากที่จะเกิดขึ้น ใครสามารถชี้ไปในทิศทางที่ถูกต้อง? อะไรคือวิธีการที่วัตถุนี้เปิดเผย? รองรับเบราว์เซอร์ใดบ้าง


8
ดูว่าฉันสามารถใช้การแยกวิเคราะห์ JSON ได้เมื่อใด สำหรับข้อมูลเกี่ยวกับเบราว์เซอร์ที่มีการสนับสนุนพื้นเมืองสำหรับวัตถุ JSON
outis

คำตอบ:


108

เบราว์เซอร์สมัยใหม่ทั้งหมดรองรับการเข้ารหัส / ถอดรหัส JSON ดั้งเดิม (Internet Explorer 8+, Firefox 3.1+, Safari 4+ และ Chrome 3+) โดยทั่วไปJSON.parse(str)จะแยกสตริง JSON ในstrและกลับวัตถุและJSON.stringify(obj)จะกลับมาเป็นตัวแทน JSON objของวัตถุ

รายละเอียดเพิ่มเติมเกี่ยวกับบทความ MDN


ฉันรู้ว่าการสนับสนุนยังไม่แพร่หลาย แต่การใช้วิธีนี้น่าจะเร็วกว่าและปลอดภัยกว่าการใช้สตริงแบบ eval () มากดังนั้นฉันจึงต้องการใช้เมื่อมีให้บริการ มีความคิดเกี่ยวกับการสนับสนุนจากเบราว์เซอร์อื่นหรือไม่?
เลวิ

17
โอ้และโปรดทราบว่าไม่เคย eval () สตริง JSON ให้ใช้หนึ่งในไลบรารีการแยกวิเคราะห์ JSON ที่มีให้แทน
Sasha Chedygov

1
@colbeerhey: ใช่นั่นคือสิ่งที่ฉันเห็นบ่อยที่สุด คุณสามารถขโมย jQuery ได้ด้วย
Sasha Chedygov

2
สำหรับการอ้างอิงเมื่อคุณพูดว่า "NEVER eval () ... " จากนั้นระบุว่า json2 เป็นไลบรารีที่ได้รับการสนับสนุนเป็นที่นิยมควรสังเกตว่ามันใช้ eval แต่จะพยายามตรวจสอบความถูกต้องของสตริงโดยใช้ regex ก่อน ซึ่งเร็วกว่าการตรวจสอบความถูกต้องและแยกวิเคราะห์สตริงแม้ว่าจะมีตัวแยกวิเคราะห์ที่ตรวจสอบไม่ได้ด้วยประสิทธิภาพที่เทียบเคียงได้ json2.js ยังคงเป็นตัวเลือกที่ดีที่สุดหากเพียงเพื่อความแพร่หลาย
TheXenocide

2
@TheXenocide: จุดดี แต่ผู้เขียนอาจใช้เวลาส่วนใหญ่ในการตรวจสอบรหัสนั้นดังนั้นฉันจึงบอกว่าอย่าใช้eval()สตริง JSON เพราะคุณจะสร้างวงล้อใหม่และคุณอาจเข้าใจผิด
Sasha Chedygov

30

jQuery-1.7.1.js - 555 บรรทัด ...

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        .replace( rvalidtokens, "]" )
        .replace( rvalidbraces, "")) ) {

        return ( new Function( "return " + data ) )();

    }
    jQuery.error( "Invalid JSON: " + data );
}





rvalidchars = /^[\],:{}\s]*$/,

rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,

rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,

rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,

4
ดี. ข้อโต้แย้งที่ดีในการใช้ jQuery
OneWorld

11
เหมือนอาร์กิวเมนต์เพื่อดูภายใน jQuery =)
Olga

13

ข้อดีของการใช้ json2.js คือจะติดตั้ง parser เฉพาะในกรณีที่เบราว์เซอร์ยังไม่มี คุณสามารถรักษาความเข้ากันได้กับเบราว์เซอร์รุ่นเก่า แต่ใช้ตัวแยกวิเคราะห์ JSON ดั้งเดิม (ซึ่งปลอดภัยและเร็วกว่า) หากมี

เบราว์เซอร์ที่มี Native JSON:

  • IE8 +
  • Firefox 3.1+
  • Safari 4.0.3+
  • Opera 10.5+

ช.


10

[การขยายความคิดเห็นmusicfreak ]

หากคุณใช้ jQuery ให้ใช้parseJSON

var obj = jQuery.parseJSON(data)

ภายในจะตรวจสอบว่าเบราว์เซอร์รองรับ. JSON.parse หรือไม่และ (ถ้ามี) เรียกหน้าต่างเนทีฟ JSON.parse

ถ้าไม่ให้แยกวิเคราะห์ตัวเอง


8

เพื่อประโยชน์ของทุกคนที่เข้ามาในเธรดนี้ - สำหรับรายการเบราว์เซอร์ที่เป็นปัจจุบันและชัดเจนที่รองรับออบเจ็กต์ JSON โปรดดูที่นี่ . คำตอบทั่วไปสั้น ๆ - เบราว์เซอร์ทั้งหมดที่มีความสำคัญมากในปี 2013+

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