2013-03-08 7 views
5

注:この質問はEmbedding JSON objects in script tagsに非常に近いですが、その質問に対する回答は私がすでに知っていることを提供しています(JSON / == \/)。私はその脱出をする方法を知りたい。PythonでJSONのHTMLタグで '/'を閉じるのを避けるにはどうしたらいいですか?

HTML仕様では、閉じたHTMLタグを<script>要素内のどこかで禁止しています。

私の場合は
<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というメソッドを使用できます。コードが機能しない場合は、pipまたはeasy_installでインストールする必要があります。 encodedはあなたにこれを与える

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

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

これはスラッシュよりも全体的なソリューションであり、それは、他のエンコーディングの注意事項を扱うよう置き換える次に、あなたがこのような何かを行うことができます。

loadsの部分は、すでにエンコードされているJSONの副作用です。これは、可能な場合はJSONを生成し、代わりのsimplejsonを使用するためにはDjangoを使用しないことで回避できます。

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> 

それは意味していますこの種のことについてパーサにフラグを立てる。それ以外の場合は、前述の文字エスケープを使用する必要があります。

+0

これはXHTMLでのみ有効です。 '' <!doctype html> ''では、 '' CDATA''は動作していないようです。だから私はJSONで '' \/''エスケープすることを好みました。問題は、テキスト自体をエスケープする方法よりも、エスケープのための文字列置換を行う方法に関するものでした。 –

+0

@GeoffreyHingああ、私は間違ってXHTMLの部分を想定していた。私はDJangoエスケープパートのための私の答えを更新しました。 – cwgem

+1

@GeoffreyHing:djangoには、 'django.utils import simplejson'を使用してインポートできるsimplejsonの独自のコピーが付属していますので、別途インストールする必要はありません。 –

関連する問題