2011-03-07 33 views
6

Tôi đã chuỗi JSON sau, mã hóa với PHP 5.2 json_encode():JSON.parse() vấn đề với biểu hiện thường xuyên đánh giá cao

{"foo":"\\."} 

JSON Chuỗi là hợp lệ. Bạn có thể kiểm tra xem nó ra tại http://www.jsonlint.com/

Nhưng phương pháp tự nhiên JSON.parse() (Chrome, Firefox), ném các lỗi sau, trong khi phân tích:

SyntaxError: Unexpected token ILLEGAL 

Hiện ai các bạn biết, tại sao tôi không thể phân tích cú pháp thoát khỏi ký tự meta biểu thức chính quy?

Ví dụ này hoạt động:

{"foo":"\\bar"} 

Nhưng có một điều này cũng thất bại:

{"foo":"\\?"} 

BTW: \. chỉ là một bài kiểm tra biểu thức chính quy đơn giản, mà tôi muốn chạy qua đối tượng RegExp javascript của.

Cám ơn sự ủng hộ của bạn,

Dyvor

+3

Nó hoạt động cho ''{" foo ":" \\\\? "}''. Vì vậy, có vẻ như bạn phải "thoát đôi" các nhân vật. ''{" foo ":" \\ bar "}'' ** có vẻ ** hoạt động (nó không có lỗi) nhưng kết quả sẽ là '{foo:" ar "}'. –

Trả lời

9

Nó "không làm việc" vì bạn đang bỏ lỡ một điểm quan trọng: có hai chuỗi phân tích xảy ra khi bạn gõ vào giao diện điều khiển Chrome một dòng như:

JSON.parse('{"foo": "\\."}'); 

Các chuỗi đầu tiên phân tích cú pháp xảy ra khi trình thông dịch JavaScript phân tích chuỗi hằng số bạn đang chuyển sang phương thức "phân tích cú pháp()". Việc phân tích cú pháp chuỗi giây xảy ra bên trong trình phân tích cú pháp JSON. Sau lần vượt qua đầu tiên, dấu gạch chéo ngược đôi chỉ là dấu gạch chéo ngược đơn.

này một:

{"foo":"\\bar"} 

công trình vì "\ b" là một nội chuỗi escape sequence hợp lệ.

+0

+1 Tôi sắp viết một cái gì đó tương tự ... –

+0

+1 Quyền của Pointy var test = {"foo": "\\ bar"}; cảnh báo (JSON.stringify (kiểm tra)); // cảnh báo '{"foo": "\\ bar"}'; var test2 = '{"foo": "\\ bar"}'; Cảnh báo (JSON.stringify (JSON.parse (test2))); // cảnh báo '{"foo": "\ bar"}'; – DefyGravity

+1

@ DefyGravity Tôi không hiểu những gì bạn đang nhận được ở đó. -- ồ được thôi :-) – Pointy

0

thêm thêm một bộ \\, là tại sao nó hoạt động Tôi không chắc chắn chính xác.

JSON.parse('{"foo":"\\\\."}'); 
+0

Nó hoạt động vì có hai phân tích xảy ra: phân tích cú pháp JavaScript của hằng số chuỗi được mã hóa thành biểu thức cuộc gọi hàm, sau đó phân tích cú pháp JSON của chuỗi kết quả. – Pointy

1

Nó hoạt động cho tôi trong bảng điều khiển firebug.

>>> JSON.parse('"\\\\."'); 
"\." 

đó là chính xác như phân tích cú pháp JSON thực sự nhận được "\\.", tức là một dấu xồ nguợc esacped và một dấu chấm.

Sự cố có thực sự xảy ra với bạn khi có phản hồi từ PHP không? Hoặc chỉ trong một bài kiểm tra "thủ công"?

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