Hỗ trợ JSON gốc cho trình duyệt (window.JSON)


92

Tôi đã thấy các tham chiếu đến một số trình duyệt tự nhiên hỗ trợ phân tích cú pháp JSON / tuần tự hóa các đối tượng một cách an toàn và hiệu quả thông qua window.JSONĐối tượng, nhưng khó có chi tiết. Bất cứ ai có thể chỉ ra đúng hướng? Các phương pháp mà Đối tượng này tiết lộ là gì? Nó được hỗ trợ trên những trình duyệt nào?


8
Xem Khi nào tôi có thể sử dụng phân tích cú pháp JSON? để biết thông tin về các trình duyệt có hỗ trợ riêng cho đối tượng JSON .
outis

Câu trả lời:


108

Tất cả các trình duyệt hiện đại đều hỗ trợ mã hóa / giải mã JSON gốc (Internet Explorer 8+, Firefox 3.1+, Safari 4+ và Chrome 3+). Về cơ bản, JSON.parse(str)sẽ phân tích cú pháp chuỗi JSON strvà trả về một đối tượng, và JSON.stringify(obj)sẽ trả về biểu diễn JSON của đối tượng obj.

Thông tin chi tiết về bài báo MDN .


Tôi biết sự hỗ trợ không phổ biến, nhưng sử dụng phương pháp này sẽ nhanh hơn và an toàn hơn nhiều so với eval () trong một chuỗi, vì vậy tôi muốn sử dụng nó ở những nơi có sẵn. Bất kỳ ý tưởng về hỗ trợ từ các trình duyệt khác?
levik

17
Ồ, và một lưu ý nhỏ, KHÔNG BAO GIỜ các chuỗi JSON eval (). Thay vào đó, hãy sử dụng một trong nhiều thư viện phân tích cú pháp JSON có sẵn.
Sasha Chedygov

1
@colbeerhey: Vâng, đó là điều tôi thấy thường xuyên nhất. Bạn cũng có thể ăn cắp jQuery.
Sasha Chedygov

2
Để tham khảo, khi bạn nói "KHÔNG BAO GIỜ eval () ..." và sau đó đề cập rằng json2 là thư viện được hỗ trợ phổ biến, cần lưu ý rằng nó sử dụng eval, nhưng nó cố gắng xác thực chuỗi bằng regex trước. Điều này nhanh hơn xác thực và phân tích cú pháp chuỗi, mặc dù có những trình phân tích cú pháp không xác thực với hiệu suất tương đương. json2.js có lẽ vẫn là lựa chọn tốt nhất, nếu chỉ vì sức lan tỏa của nó.
TheXenocide

2
@TheXenocide: Điểm tốt, nhưng tác giả của nó có lẽ đã dành rất nhiều thời gian cho mã xác thực đó, vì vậy tôi nói không bao giờ eval()chuỗi JSON vì bạn sẽ phát minh lại bánh xe và có thể bạn sẽ làm sai.
Sasha Chedygov

30

jQuery-1.7.1.js - dòng 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
Đẹp. Đối số tốt để sử dụng jQuery.
OneWorld,

11
Giống như một đối số để xem xét bên trong jQuery =)
Olga

13

Ưu điểm của việc sử dụng json2.js là nó sẽ chỉ cài đặt một trình phân tích cú pháp nếu trình duyệt chưa có. Bạn có thể duy trì khả năng tương thích với các trình duyệt cũ hơn, nhưng hãy sử dụng trình phân tích cú pháp JSON gốc (an toàn hơn và nhanh hơn) nếu có.

Các trình duyệt với JSON gốc:

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

G.


10

[mở rộng bình luận của musicfreak ]

Nếu bạn đang sử dụng jQuery, hãy sử dụng parseJSON

var obj = jQuery.parseJSON(data)

Bên trong nó kiểm tra xem trình duyệt có hỗ trợ .JSON.parse hay không và (nếu có) gọi native window.JSON.parse.

Nếu không, tự phân tích cú pháp.


8

Vì lợi ích của bất kỳ ai chạy vào chuỗi này - để có danh sách cập nhật, chính xác các trình duyệt hỗ trợ đối tượng JSON, hãy xem tại đây. . Một câu trả lời chung chung ngắn gọn - khá nhiều trình duyệt thực sự quan trọng trong năm 2013+.

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.