2012-04-04 34 views
13

Sencha Touch uygulamasına sahibim. Kullandığım mağazalardan biri ajax proxy ve json okuyucu kullanıyor.JSON yanıtında geçersiz karakterler

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

" 
: dönem ve bitiş alıntı arasına, burada ikinci dizede iki kez http://www.fileformat.info/info/unicode/char/2028/index.htm

görünmez olsa da, karakter oluşur: JSON benim sinatra app dönen dizeleri bazıları zaman zaman bu karakteri içeren

Kopyalamayı ve yapıştırmayı deneyin "Her seviye, düşmanı ezmek için mantık, beceri ve kaba kuvvet gerektirir." Javascript konsolunuza! Bir dize olarak ayrıştırılmayacak ve SyntaxError: Unexpected token ILLEGAL ile başarısız.

Bu, JSON yanıtının başarısız olmasına neden olur. Uzun zamandır bunun üzerine takıldım! Baska öneri?

+1

Neden sadece sunucu tarafında çıkış JSON dizesinden kötü karakteri kaldırmak? –

+0

@MaratTanalin Şu an bakıyorum ama yakın zamana kadar sunucuya erişimim olmadı. Sanırım müşteri tarafı çözümü yok mu? – nnyby

+3

Dize yasadışı JavaScript hazırlayıcısıysa (örneğinizle ilgili emin değilsiniz, ancak, örneğin, JS literallerinde izin verilmeyen satır beslemelerine izin verilmiyorsa), istemci tarafı çözümünün olması olası değildir. Yine de JSON Ajax yanıtını JSON yerine _text_ olarak almayı deneyebilir, ancak dizeden istenmeyen karakteri filtreleyebilir ve ardından filtrelenmiş dizeyi JSON dizesi olarak ayrıştırabilirsiniz. Ne yazık ki bu bir geçici çözüm. JSON dizelerinizdeki yasadışı karakterin özel niteliğini bulmak ve nedenini çözmek daha iyi olacaktır. –

cevap

5

Bunu düzeltmenin tek güvenilir yolu sunucu tarafıdır. JSON jeneratörünüzün kaçan karakterleri yaydığından emin olun, ör. \u2028 olarak.

Deneyimlerime göre, JSON'unuzu her zaman işe yarayacak düz ASCII kodlamak en kolay yoldur. Dezavantajı, ASCII olmayan karakterlerin daha fazla yer kaplayacağından daha az verimli olması, yani bu frekansın sıklığına bağlı olarak, bu işlemden vazgeçmek istemeyebilirsiniz ...

Perl'in JSON :: XS belgeleri Sorunun iyi bir açıklamasını ve nasıl düzeltileceğini öğrenmek için Perl:

+1

Bağlantı düzeltildi. Teşekkürler. – Lasse

0

Kavramsal olarak, yalnızca izinsiz olarak çıkarak geçerli JavaScript hazırlıkları olan sunucudan dizeleri göndermeye izin verilir.

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

Ama sunucuda kaçmak gerekir çünkü tartışma, artık kullanılmıyor: Eğer fazladan geçici çözüm adımı ihtiyaç istemci üzerinde bu sorunu gidermek istiyorsanız

(sadece Firefox'ta çalışıyor gibi görünüyor) .

+3

Kod ayrıştırılamayacak, _fix_ istemci tarafında! –

+0

Benim için ateş topu ile ff üzerinde çalıştı, denediniz mi? – Sam

+0

Chrome'da denedim. OP'in kodunun bir kısmını ':' sonra kopyaladı ve konsol içine yapıştırdı, sözdizimi hatası aldı. –

-1

uygulama söz konusu ise bu bir ok:

var object = $.parseJSON(json_string); 
İlgili konular