2011-10-16 32 views
6

Tôi đang cố gắng để mã hóa một mảng Python vào simplejson.dumps json sử dụng:escapejs django và simplejson

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

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

trình tốt.

Nhưng tôi muốn thoát khỏi chuỗi đầu tiên (sử dụng escapejs từ Django) trước simplejson.dumps gọi:

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

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

Vấn đề của tôi là: Tôi muốn chuỗi thoát là: ["test", "\u003Cscript\u003E"] thay vì ["test", "\\u003Cscript\\u003E"]

tôi có thể sử dụng replace:

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

Nhưng đây là một cách tiếp cận tốt? Tôi chỉ muốn thoát khỏi chuỗi đầu tiên trước khi mã hóa chúng thành json. Vì vậy, sẽ không có lỗi cú pháp khi tôi sử dụng chúng trong mẫu.

Cảm ơn. :)

Trả lời

8

simplejson 2.1.0 và sau đó bao gồm bộ mã hóa JSONEncoderForHTML thực hiện chính xác những gì bạn muốn. Để sử dụng nó trong ví dụ của bạn:

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

Gần đây tôi không có quyền kiểm soát mã tạo cấu trúc dữ liệu, vì vậy tôi không thể thoát khỏi chuỗi khi chúng được lắp ráp. JSONEncoderForHTML giải quyết vấn đề gọn gàng tại điểm đầu ra.

Tất nhiên, bạn sẽ cần phải có simplejson 2.1.0 trở lên. (Django sử dụng để đi kèm với một phiên bản cũ, và Django 1.5 không chấp nhận django.utils.simplejson hoàn toàn.) Nếu bạn không thể nâng cấp vì lý do nào đó, JSONEncoderForHTML code là tương đối nhỏ và có thể có thể được kéo vào mã trước đó hoặc sử dụng với Python 2.6+'s json package - - mặc dù tôi đã không tự mình thử bản thân này

+0

Có, bạn đúng cách addlashes đã không làm việc cho tôi. Tôi không biết rằng có JSONEncoderForHTML. Cảm ơn bạn rất nhiều vì đã giúp tôi. :) – srcastro

0

Bạn đang thực hiện các thao tác theo thứ tự sai. Bạn nên đổ dữ liệu của bạn vào một chuỗi JSON, sau đó thoát khỏi chuỗi đó. Bạn có thể thực hiện thoát với bộ lọc Django addslashes.

+0

Cảm ơn bạn rất nhiều vì đã giúp đỡ. Tôi rất trân trọng điều này. :) – srcastro

+0

Tôi sẽ không khuyên bạn nên 'addslashes' để tạo json hoặc html - tôi tin rằng nó có nghĩa là để chuẩn bị SQL. 'addslashes' sẽ không bảo vệ chống lại một cái gì đó như' '' 'trong một trong các chuỗi của bạn bị rò rỉ vào html của bạn. Câu hỏi ban đầu đã đề cập đến 'escapejs', và đó chính là lối thoát thích hợp để sử dụng cho đầu ra JavaScript. – medmunds