6

simplejson.dumps を使用して、Python 配列を json にエンコードしようとしています。

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

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

正常に動作します。

しかし、simplejson.dumps を呼び出す前に、(Django の 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にエンコードする前に、最初に文字列をエスケープしたいだけです。したがって、テンプレートで使用しても構文エラーは発生しません。

ありがとう。:)

4

2 に答える 2

8

simplejson 2.1.0以降には、必要な処理を正確に実行するJSONEncoderForHTMLエンコーダーが含まれています。あなたの例でそれを使用するには:

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

私は最近、データ構造を生成しているコードを制御できなかったため、文字列がアセンブルされているときに文字列をエスケープできなかったという状況に遭遇しました。JSONEncoderForHTMLは、出力の時点で問題をきちんと解決しました。

もちろん、simplejson2.1.0以降が必要です。(Djangoには古いバージョンが付属しており、Django 1.5ではdjango.utils.simplejsonが完全に廃止されました。)何らかの理由でアップグレードできない場合、JSONEncoderForHTMLコードは比較的小さいため、以前のコードにプルするか、Pythonで使用できます。 2.6+のjsonパッケージ-私はこれを自分で試したことがありませんが

于 2011-10-18T02:11:13.283 に答える
0

あなたは間違った順序で操作を行っています。データを JSON 文字列にダンプしてから、その文字列をエスケープする必要があります。addslashesDjango フィルターを使用してエスケープできます。

于 2011-10-16T12:46:35.240 に答える