2011-10-16 5 views
6

내가 JSON 사용 simplejson.dumps에 파이썬 배열을 인코딩하기 위해 노력하고있어 :장고 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"]의 : 나는 이스케이프 된 문자열이 원하는

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

을하지만 이것은 좋은 방법입니다 :

나는 replace 사용할 수 있습니까? 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 준비를위한 것입니다. 'addslashes'는 여러분의 문자열 중 하나에서'' ''같은 것을 보호하지 못합니다. 원래의 질문은'escapejs '를 언급했는데, 그것은 바로 JavaScript 출력에 사용하는 올바른 이스케이프입니다. – medmunds