2013-03-08 11 views
5

Not: Bu soru Embedding JSON objects in script tags'a çok yakındır, ancak bu sorunun yanıtları zaten bildiğim şeyi sağlar (JSON / == \/). Kaçmayı nasıl yapacağımı bilmek istiyorum.Python ile JSON'daki HTML etiketlerinde '/' kapanışından nasıl kurtulurum?

HTML özellikleri, kapalı HTML etiketlerini <script> öğesinin herhangi bir yerinde yasaklar.

Benim durumumda
<script> 
var assets = [{ 
    "asset_created": null, 
    "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
    "body": "<script></script>" 
}]; 
</script> 

, ben yani Django şablonu içinde bir JSON dizesi render tarafından geçersiz durumu üretme ediyorum:

<script> 
var assets = {{ json_string }}; 
</script> 

JSON \/ ayrıştırır biliyoruz Yani, bu ayrıştırma hatalara neden olur / ile aynı, bu yüzden JSON dizesinde kapanan HTML etiketlerimi kullanabiliyorsam, iyi olacağım. Ama bunu yapmanın en iyi yolu olduğundan emin değilim. Daha iyi bir yol

json_string = '[{"asset_created": null, "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "<script></script>"}]' 
escaped_json_string = json_string.replace('</', r'<\/') 

var mı:

Benim saf yaklaşım sadece bu olurdu? Ya da baktığım herhangi bir kova var mı?

cevap

6

Güncelleme Cevap

Tamam ben yanlış bir şeyler üstlendi. JSON'dan kaçmak için, simplejson kitaplığının kullanılabileceklerinden JSONEncoderForHTML bir yöntemi vardır. Kod çalışmıyorsa, pip veya easy_install aracılığıyla yüklemeniz gerekebilir. Sonra böyle bir şey yapabilirsiniz:

'{"asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "\\u003cscript\\u003e\\u003c/script\\u003e", "asset_created": null}' 

Bu aynı zamanda diğer kodlama uyarıları kolları olarak değiştirin eğik çizgi daha genel bir çözümdür: encoded bu verecektir

import simplejson 
asset_json=simplejson.loads(json_string) 
encoded=simplejson.encoder.JSONEncoderForHTML().encode(assets_json) 

.

loads bölümü, JSON kodlanmış haliyle bir yan etkisidir.

CDATA daki komut kaydırma deneyin

simplejson.dumps(your_object_to_encode, cls=simplejson.encoder.JSONEncoderForHTML) 

Eski Cevap: Bu demek oluyor

<script> 
//<![CDATA[ 
var assets = [{ 
    "asset_created": null, 
    "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
    "body": "<script></script>" 
}]; 
//]]> 
</script> 

Bu mümkünse JSON üretmek için Django kullanan ve bunun yerine simplejson kullanmayan önlenebilir ayrıştırıcıyı bu tür bir şeyde işaretlemek için. Aksi takdirde, bahsedilen karakter kaçışlarını kullanmanız gerekir.

+0

Ama bu sadece XHTML için çalışıyor, değil mi? '' '' '' CDATA'' ile çalışmıyor. Bu yüzden JSON’dan kaçmayı tercih ettim. Soru, kaçış için dizgenin nasıl değiştirileceğinden, metnin kendisinden nasıl kaçılacağından daha fazlasıydı. –

+0

@GeoffreyHing Ah evet XHTML bölümünü hatalı olarak kabul ettim. DJango kaçan kısmı için cevabımı güncelledim. – cwgem

+1

@GeoffreyHing: django, '' django.utils import simplejson '' yöntemini kullanarak içe aktaracağınız basit bir kopya ile birlikte gönderir, böylece ayrı olarak yüklemeniz gerekmez. –