Подтвердить что ты не робот

Недопустимые символы в ответе JSON

У меня есть приложение Sencha Touch. В одном из хранилищ я использую ajax-прокси и json-ридер. Некоторые из строк в JSON, возвращенные из моего приложения синатра, иногда содержат этот символ: http://www.fileformat.info/info/unicode/char/2028/index.htm

Хотя он невидим, символ встречается дважды во второй строке здесь, между периодом и конечной цитатой:

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

"

Попробуйте скопировать и вставить "Каждый из уровней требует логики, умения и грубой силы, чтобы сокрушить врага", в вашу консоль javascript! Он не будет анализироваться как строка и не с SyntaxError: Unexpected token ILLEGAL.

Это приводит к сбою ответа JSON. Я застрял на этом в течение долгого времени! Любые предложения?

4b9b3361

Ответ 1

Единственный надежный способ исправить это - серверная. Убедитесь, что ваш генератор JSON выбрасывает эти символы, например, как \u2028.

По моему опыту, проще всего просто закодировать JSON в простом ASCII, который всегда будет работать. Недостатком является то, что он менее эффективен, так как символы, отличные от ASCII, занимают больше места, поэтому, в зависимости от частоты тех, вам может не понадобиться компромисс...

Документация для Perl JSON:: XS имеет хорошее объяснение проблемы и рекомендации по ее исправлению в Perl: http://search.cpan.org/perldoc?JSON::XS#JSON_and_ECMAscript

Ответ 2

Концептуально вам разрешено отправлять строки с сервера, которые являются действительными литералами JavaScript, соответствующим образом экранируя.

Если вы хотите исправить эту проблему на клиенте, вам понадобится дополнительный шаг в обходном пути (работает только в Firefox):

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

Но обсуждение устарело, потому что вы должны скрыться на сервере.

Ответ 3

если вы используете JQuery в своем приложении, тогда это нормально:

var object = $.parseJSON( json_string );