2013-05-22 24 views
13

Đôi khi tôi see trong một trang xem nguồn (html xem mã nguồn) mã này:JSON.stringify và " u2028 u2029" kiểm tra?

if (JSON.stringify(["\u2028\u2029"]) === '["\u2028\u2029"]') JSON.stringify = function (a) { 
    var b = /\u2028/g, 
     c = /\u2029/g; 
    return function (d, e, f) { 
     var g = a.call(this, d, e, f); 
     if (g) { 
      if (-1 < g.indexOf('\u2028')) g = g.replace(b, '\\u2028'); 
      if (-1 < g.indexOf('\u2029')) g = g.replace(c, '\\u2029'); 
     } 
     return g; 
    }; 
}(JSON.stringify); 
  • vấn đề với JSON.stringify(["\u2028\u2029"]) mà nó cần phải được kiểm tra là gì?

Thông tin thêm:

  • JSON.stringify(["\u2028\u2029"]) giá trị là "["

"]"
  • '["\u2028\u2029"]' giá trị cũng là "["

"]"
+0

Liên quan http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/ và https://code.google.com/p/v8/issues/chi tiết? id = 1907 – andyb

Trả lời

7

Tôi nghĩ đó có thể là tính năng bảo mật. FileFormat.info cho 20282029 có biểu ngữ tuyên bố

Không sử dụng ký tự này trong tên miền. Trình duyệt là blacklisting do có khả năng lừa đảo.

Nhưng hóa ra là các dấu tách dòng và đoạn \u2028\u2029 tương ứng được coi là dòng mới trong mã JavaScript ES5.

Từ http://www.thespanner.co.uk/2011/07/25/the-json-specification-is-now-wrong/

\ u2028 và \ u2029 nhân vật có thể phá vỡ toàn bộ JSON nguồn cấp dữ liệu từ chuỗi sẽ chứa một dòng mới và phân tích cú pháp JavaScript sẽ giải cứu

Vì vậy, bạn đang nhìn thấy một vá cho JSON.stringify. Xem thêm Node.js JavaScript-stringify

Edit: Vâng, trình duyệt hiện đại built-in JSON đối tượng nên chăm sóc này một cách chính xác. Tôi không thể tìm thấy bất kỳ liên kết đến các nguồn thực tế để trở lại này mặc dù. Chromium code search không đề cập đến bất kỳ lỗi nào có thể đảm bảo thêm cách giải quyết này theo cách thủ công. Có vẻ như Firefox 3.5 là phiên bản đầu tiên có hỗ trợ JSON gốc, tuy nhiên, not entirely không có lỗi. IE8 cũng hỗ trợ nó. Vì vậy, nó có thể là một bản vá không cần thiết bây giờ, giả sử các trình duyệt đã thực hiện các đặc điểm kỹ thuật một cách chính xác.

+0

Có phải đối tượng JSON được xây dựng trong trình duyệt - đã xử lý nó cho chúng ta chưa? và nếu có - tại sao tôi cần séc? –

+0

Tôi đã thêm một số chi tiết bổ sung vào câu trả lời. Tóm lại, có thể bạn không cần bản vá trong các trình duyệt hiện đại. – andyb

1

\u2028\u2029 đang ẩn Unicode lineparagraph ký tự phân cách. Phương pháp tương đối JSON.stringify chuyển đổi các mã này thành biểu diễn tượng trưng của chúng (như JavaScript tự động thực hiện trong các chuỗi), dẫn đến "["

"]". Mã bạn đã cung cấp không cho phép JSON chuyển đổi mã thành các biểu tượng và giữ nguyên biểu diễn \uXXXX trong chuỗi đầu ra, tức là trả về "["\u2028\u2029"]".

+0

Nếu nó là theo mặc định vậy tại sao làm kiểm tra? –

+0

@RoyiNamir Để kiểm tra xem trường hợp chức năng đã được ghi đè hay chưa. – VisioN

+0

Cảm ơn. Vì vậy, toàn bộ ý tưởng là để ** bảo tồn ** ý nghĩa ban đầu của những nhân vật đó? –

3

Sau khi đọc cả câu trả lời, đây là lời giải thích đơn giản hình ảnh:

làm điều này

alert(JSON.stringify({"a":"sddd\u2028sssss"})) // có thể gây ra vấn đề

sẽ cảnh báo:

enter image description here

Trong khi thay đổi người gây rắc rối cho người khác (ví dụ: \u để \1u)

sẽ cảnh báo:

enter image description here

Bây giờ, chúng ta hãy gọi hàm từ gốc Q của tôi,

Cho phép thử này alert(JSON.stringify({"a":"sddd\u2028sssss"})) một lần nữa:

kết quả:

enter image description here

và bây giờ, mọi người đều hạnh phúc.