2012-04-04 47 views
13

Tôi có ứng dụng Sencha Touch. Một trong những cửa hàng tôi đã sử dụng một proxy ajax và một người đọc json. Một số loại dây trong JSON trở về từ ứng dụng Sinatra của tôi thỉnh thoảng chứa nhân vật này: http://www.fileformat.info/info/unicode/char/2028/index.htmCác ký tự không hợp lệ trong phản hồi JSON

Mặc dù nó là vô hình, nhân vật xuất hiện hai lần trong chuỗi thứ hai ở đây, giữa kỳ và báo giá kết thúc:

"description": "Each of the levels requires logic, skill, and brute force to crush the enemy.

" 

Hãy thử sao chép và dán "Mỗi cấp độ yêu cầu logic, kỹ năng và sức mạnh vũ phu để đè bẹp kẻ thù." Vào bảng điều khiển javascript của bạn! Nó sẽ không được phân tích cú pháp dưới dạng chuỗi và không thành công với SyntaxError: Unexpected token ILLEGAL.

Điều này làm cho phản hồi JSON thất bại. Tôi đã bị mắc kẹt trong một thời gian dài! Bất kỳ đề xuất?

+1

Tại sao không chỉ loại bỏ các nhân vật xấu từ đầu ra JSON chuỗi trên phía máy chủ? –

+0

@MaratTanalin Tôi đang xem xét điều đó ngay bây giờ, nhưng cho đến gần đây tôi không có quyền truy cập vào máy chủ. Tôi đoán không có giải pháp phía khách hàng? – nnyby

+3

Nếu chuỗi là chữ JavaScript bất hợp pháp (không chắc chắn về trường hợp của bạn, nhưng, ví dụ, nguồn cấp dữ liệu không thoát hình thức không được phép trong JS literals), thì giải pháp phía máy khách không tồn tại. Mặc dù có thể bạn có thể thử nhận phản hồi JSON Ajax dưới dạng _text_ thay vì JSON, sau đó lọc ký tự không mong muốn khỏi chuỗi đó dưới dạng chuỗi và sau đó phân tích cú pháp chuỗi được lọc dưới dạng chuỗi JSON. Thật không may đó là một workaround. Nó sẽ là tốt hơn để tìm bản chất cụ thể của các ký tự bất hợp pháp trong chuỗi JSON của bạn và giải quyết lý do. –

Trả lời

5

Cách đáng tin cậy duy nhất để khắc phục điều này là phía máy chủ. Đảm bảo trình tạo JSON của bạn phát ra các ký tự đó đã thoát, ví dụ: là \u2028.

Theo kinh nghiệm của tôi, cách đơn giản nhất là mã hóa JSON của bạn ở dạng ASCII thuần tuý sẽ luôn hoạt động. Nhược điểm là nó kém hiệu quả hơn vì các ký tự không phải ASCII sẽ chiếm nhiều không gian hơn, do đó tùy thuộc vào tần số của chúng, bạn có thể không muốn sự cân bằng đó ...

Tài liệu về Perl's JSON :: XS có một lời giải thích tốt của vấn đề và tư vấn về cách sửa chữa nó trong Perl: http://search.cpan.org/perldoc?JSON::XS#JSON_and_ECMAscript

+1

Liên kết cố định. Cảm ơn. – Lasse

0

Về mặt khái niệm, bạn chỉ được phép gửi các chuỗi từ máy chủ có chữ JavaScript hợp lệ bằng cách thoát một cách thích hợp.

Nếu bạn muốn khắc phục vấn đề này trên máy khách bạn cần một bước workaround thêm (chỉ dường như làm việc trong Firefox):

var a = escape("Each of the levels requires logic, skill, and brute force to crush the enemy."); 
alert(unescape(a)); 

Nhưng cuộc thảo luận là lỗi thời, bởi vì bạn phải chạy trốn trên máy chủ .

+3

Mã sẽ không phân tích để bạn không thể _fix_ nó ở phía khách hàng! –

+0

Đối với tôi nó đã làm việc trên ff với firebug, có bạn thậm chí đã thử nó? – Sam

+0

Tôi đã dùng thử trong Chrome. Đã sao chép phần mã OP sau khi ':' và dán nó trong bảng điều khiển, có lỗi cú pháp. –

-1

nếu bạn đang sử dụng JQuery trong bạn ứng dụng sau đó cái này là ok:

var object = $.parseJSON(json_string); 
Các vấn đề liên quan