2011-10-16 5 views
6

私はsimplejson.dumpsを使用してJSONにPythonの配列をエンコードしようとしている:ジャンゴescapejsとのsimplejson

In [30]: s1 = ['test', '<script>'] 

In [31]: simplejson.dumps(s1) 
Out[31]: '["test", "<script>"]' 

作品罰金を。

しかし、私はsimplejson.dumpsを呼び出す前に(ジャンゴからescapejsを使用して)最初の文字列をエスケープしたい:

In [35]: s_esc 
Out[35]: [u'test', u'\\u003Cscript\\u003E'] 

In [36]: print simplejson.dumps(s_esc) 
["test", "\\u003Cscript\\u003E"] 

私の問題がある:私はなるようにエスケープされた文字列をしたい:["test", "\u003Cscript\u003E"]の代わり["test", "\\u003Cscript\\u003E"]

私はreplaceを使用することができます。

In [37]: print simplejson.dumps(s_esc).replace('\\\\', '\\') 
["test", "\u003Cscript\u003E"] 

しかし、これは良い方法ですか?私はちょうどそれらをjsonにエンコードする前に文字列をエスケープしたい。したがって、テンプレートで使用すると構文エラーは発生しません。

ありがとうございました。 :)

答えて

8

simplejson 2.1.0以降には、JSONEncoderForHTMLエンコーダが含まれています。あなたの例では、それを使用するには:私は、データ構造を生成したコードを制御できませんでしたので、彼らが組み立てされていたとして、私は、文字列をエスケープすることができませんでしたどこ

>>> s1 = ['test', '<script>'] 
>>> simplejson.dumps(s1, cls=simplejson.encoder.JSONEncoderForHTML) 
'["test", "\\u003cscript\\u003e"]' 

私は最近、これに走りました。 JSONEncoderForHTMLは、出力点で問題をきちんと解決しました。

もちろん、simplejson 2.1.0以降が必要です。 (Djangoは以前のバージョンを使用していましたが、Django 1.5は完全にdjango.utils.simplejsonを廃止しました)何らかの理由でアップグレードできない場合、JSONEncoderForHTML codeは比較的小さく、おそらく以前のコードに引っ張られたり、Python 2.6+'s json package - - 私はこれを試していませんが、

+0

はい、あなたは右のaddslashesが私にとってはうまくいかなかったのです。私はJSONEncoderForHTMLがあることを知らなかった。私を助けてくれてありがとう。 :) – srcastro

0

間違った順序で操作しています。データをJSON文字列にダンプし、その文字列をエスケープする必要があります。 Djangoフィルタaddslashesでエスケープすることができます。

+0

ありがとうございました。ほんとうにありがとう。 :) – srcastro

+0

jsonやhtmlを生成するために 'addslashes'をお勧めしません。これはSQL prepのためのものだと思います。 'addslashes'はあなたの文字列の一つに' ' ''のようなものがあなたのhtmlに漏れるのを防ぐものではありません。元の質問は 'escapejs 'と言いました。それはJavaScript出力に使うのが正しいエスケープです。 – medmunds