2012-04-04 27 views
13

Mam aplikację Sencha Touch. Jeden ze sklepów, z których korzystam, wykorzystuje serwer proxy ajax i czytnik json. Niektóre struny w JSON zwróconych z mojego Sinatra aplikacji sporadycznie zawierać ten znak: http://www.fileformat.info/info/unicode/char/2028/index.htmNiedozwolone znaki w odpowiedzi JSON

Chociaż jest to niewidoczne, występuje postać dwukrotnie w drugim ciągiem tutaj, między okresem i cytat kończący:

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

" 

Spróbuj skopiować i wkleić "Każdy z poziomów wymaga logiki, umiejętności i brutalnej siły, aby zmiażdżyć wroga." Do konsoli javascript! Nie będzie on analizowany jako ciąg znaków i nie powiedzie się z SyntaxError: Unexpected token ILLEGAL.

Powoduje to niepowodzenie odpowiedzi JSON. Utknąłem na tym przez długi czas! Jakieś sugestie?

+1

Dlaczego nie wystarczy zdjąć zły charakter z wyjścia JSON ciąg na stronie serwera? –

+0

@MaratTanalin Patrzę na to teraz, ale do niedawna nie miałem dostępu do serwera. Chyba nie ma rozwiązania po stronie klienta? – nnyby

+3

Jeśli ciąg jest niedozwolony, literał JavaScript (nie jest pewny co do twojego przypadku, ale na przykład, liniowe wiersze bez znakowania są niedozwolone w literałach JS), wtedy rozwiązanie po stronie klienta jest mało prawdopodobne. Być może jednak możesz spróbować uzyskać odpowiedź Ajaxa JSON jako _text_ zamiast JSON, następnie przefiltrować niepożądany znak z niego jako ciąg, a następnie przeanalizować filtrowany ciąg jako ciąg JSON. Niestety jest to obejście. Byłoby lepiej znaleźć specyficzny charakter nielegalnego charakteru w łańcuchach JSON i rozwiązać przyczynę. –

Odpowiedz

5

Jedynym niezawodnym sposobem naprawy jest serwer. Upewnij się, że generator JSON emituje te znaki, które uległy zmianie, np. jako \u2028.

Z mojego doświadczenia wynika, że ​​najłatwiej jest po prostu zakodować swój JSON w prostym ASCII, który zawsze będzie działał. Wadą jest to, że jest mniej wydajny, ponieważ znaki spoza zestawu ASCII zajmą więcej miejsca, więc w zależności od ich częstotliwości, możesz nie chcieć tego kompromisu ...

Dokumentacja dla JSON :: XS firmy Perl ma dobre wyjaśnienie problemu i porady, jak go naprawić w Perlu: http://search.cpan.org/perldoc?JSON::XS#JSON_and_ECMAscript

+1

Naprawiono łącze. Dzięki. – Lasse

0

Konceptualnie dozwolone jest wysyłanie tylko łańcuchów z serwera, które są poprawnymi literałami JavaScript, odpowiednio uciekając.

Jeśli chcesz, aby rozwiązać ten problem na kliencie trzeba dodatkowy krok Rozwiązanie (tylko wydaje się działać w Firefoksie):

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

Ale dyskusja jest przestarzały, ponieważ trzeba uciec na serwerze .

+3

Kod nie będzie parsował, więc nie możesz _fix_ to po stronie klienta! –

+0

Dla mnie to działało na ff z firebug, czy próbowałeś go? – Sam

+0

Próbowałem go w Chrome. Skopiowano fragment kodu OP po ':' i wkleiłem go do konsoli, otrzymałem błąd składni. –

-1

jeśli używasz JQuery w was aplikacja to ten jeden jest ok:

var object = $.parseJSON(json_string); 
Powiązane problemy