2011-01-02 16 views
6

Nếu tôi chạy điều này trong bảng điều khiển JavaScript trong Chrome hoặc Firebug, nó hoạt động tốt.Tại sao không có dấu ngoặc kép và dấu gạch chéo ngược được cho phép trong chuỗi trong tiêu chuẩn JSON?

JSON.parse('"\u0027"') // Escaped single-quote 

Nhưng nếu tôi chạy một trong 2 dòng này trong bảng điều khiển Javascript, nó sẽ phát ra lỗi.

JSON.parse('"\u0022"') // Escaped double-quote 
JSON.parse('"\u005C"') // Escaped backslash 

RFC 4627 section 2.5 dường như ngụ ý rằng \" được phép ký tự miễn là họ đang đúng cách trốn thoát. Tuy nhiên, 2 trình duyệt mà tôi đã thử không cho phép nó. Có điều gì tôi đang làm sai ở đây hay là họ thực sự không được phép trong chuỗi? Tôi cũng đã thử sử dụng \"\\ thay cho số \u0022\u005C tương ứng.

Tôi cảm thấy như mình đang làm điều gì đó rất sai, vì tôi thấy khó tin rằng JSON sẽ không cho phép các ký tự này trong chuỗi, đặc biệt là vì đặc điểm kỹ thuật dường như không đề cập đến bất cứ điều gì mà tôi có thể tìm thấy không được phép.

Trả lời

8

Bạn cần trích dẫn dấu gạch chéo ngược!

đó mà chúng ta gọi là một bông hồng

Bằng bất kỳ tên khác sẽ mùi như ngọt

Một dấu nháy kép là một dấu nháy kép, không có vấn đề làm thế nào bạn thể hiện nó trong chuỗi liên tục. Nếu bạn đặt dấu gạch chéo ngược trước biểu thức \u trong hằng số, thì hiệu ứng sẽ là dấu ngoặc kép trích dẫn ngược lại, thực tế là bạn đã có.

Điều thú vị nhất về câu hỏi của bạn là nó giúp tôi nhận ra rằng mọi trình phân tích cú pháp chuỗi JavaScript mà tôi từng viết đều sai.

3

Bạn không thoát dấu gạch chéo ngược và dấu ngoặc kép, vì \ u00xx đang được trình phân tích cú pháp javascript giải thích.

JSON.parse('"\\\u0022"') 
JSON.parse('"\\\""') 

JSON.parse('"\\\u005C"') 
JSON.parse('"\\\\"') 

công việc như mong đợi.

+0

'JSON.parse' đã giúp tôi! Cảm ơn ...: D –

4

JavaScript đang diễn giải chuỗi thoát Unicode trước khi chúng đến trình phân tích cú pháp JSON. Điều này đặt ra một vấn đề:

  • '"\u0027"' không thể viện chứng lần đầu tiên (bằng JavaScript): "'"
    Lần thứ hai (bằng cách phân tích cú pháp JSON) JSON là hợp lệ đại diện cho chuỗi: '

  • '"\u0022"' không thể viện chứng đầu tiên thời gian (bằng JavaScript): """
    Trình phân tích cú pháp JSON thấy phiên bản này chưa được kiểm duyệt """ là JSON không hợp lệ (không mong đợi dấu ngoặc kép cuối cùng).

  • '"\u005C"' không thể viện chứng lần đầu tiên (bằng JavaScript): "\"
    Các phân tích cú pháp JSON cũng thấy phiên bản không thể viện chứng này "\" JSON là không hợp lệ (dấu ngoặc kép thứ hai là dấu chéo ngược thoát và do đó không chấm dứt chuỗi).

Khắc phục sự cố này là thoát khỏi trình tự thoát, như trong thực tế, có thể bạn sẽ không sử dụng trình phân tích cú pháp JSON. Được sử dụng trong ngữ cảnh chính xác (đảm bảo bằng cách gói nó trong ngoặc đơn, tất cả JSON là JavaScript hợp lệ.

Các vấn đề liên quan