2013-03-08 81 views
5

注意:這個問題非常接近Embedding JSON objects in script tags,但對這個問題的回答提供了我已經知道的東西(在JSON / == \/中)。我想知道如何逃避。如何在使用Python的JSON中的HTML標記中關閉'/'?

HTML規範禁止在<script>元素中的任何位置關閉HTML標記。因此,這將導致解析錯誤:

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

就我而言,我生成通過渲染Django模板內的JSON字符串無效的情況下,即:

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

我知道,JSON解析\//相同,所以如果我可以在JSON字符串中跳過我的關閉HTML標記,那我會很好。但是,我不確定最好的方式來做到這一點。

我幼稚的做法只會是這樣的:

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

有沒有更好的辦法?或者我忽略的任何陷阱?

回答

6

更新回答

好吧,我認爲一些事情不正確。爲了轉義JSON,simplejson庫的可用方法爲JSONEncoderForHTML。如果代碼無效,您可能需要通過pipeasy_install進行安裝。然後,你可以做這樣的事情:

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

encoded會給你:

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

這比斜線更全面的解決方案取代,因爲它處理其他編碼警告也是如此。

loads部分是使JSON已編碼的副作用。

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

老回答

嘗試在CDATA包裝腳本:

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

它的意思這可以通過,如果可以不使用Django生成JSON,而是使用simplejson避免在這種事情上標記解析器。否則,你需要使用已經提到的字符轉義。

+0

但是,這隻適用於XHTML,對不對?用''<!doctype html>'',''CDATA''似乎不起作用。這就是爲什麼我更喜歡JSON中的''\ /''轉義。問題更多的是關於如何進行字符串替換,而不是如何逃避文本本身。 – 2013-03-08 16:13:54

+0

@GeoffreyHing啊是的我錯誤地認爲XHTML的一部分。我已經爲DJango轉義部分更新了我的答案。 – cwgem 2013-03-08 16:57:32

+1

@GeoffreyHing:django帶有它自己的simplejson副本,您可以使用'from django.utils import simplejson'導入,因此您無需單獨安裝它。 – 2013-03-08 18:06:12

相關問題