2013-03-08 35 views
5

Lưu ý: Câu hỏi này rất gần với Embedding JSON objects in script tags, nhưng câu trả lời cho câu hỏi đó cung cấp những gì tôi đã biết (trong JSON / == \/). Tôi muốn biết làm thế nào để làm điều đó thoát.Làm cách nào để thoát khỏi đóng '/' trong thẻ HTML bằng JSON bằng Python?

Đặc tả HTML cấm các thẻ HTML bị đóng ở bất kỳ đâu trong phần tử <script>. Vì vậy, điều này gây ra lỗi phân tích cú pháp:

<script> 
var assets = [{ 
    "asset_created": null, 
    "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
    "body": "<script></script>" 
}]; 
</script> 

Trong trường hợp của tôi, tôi là tạo ra tình hình không hợp lệ bằng cách làm cho một chuỗi JSON bên trong một mẫu Django, ví dụ:

<script> 
var assets = {{ json_string }}; 
</script> 

Tôi biết rằng JSON phân tích \/ giống như /, vì vậy nếu tôi chỉ có thể thoát khỏi các thẻ HTML đóng của tôi trong chuỗi JSON, tôi sẽ tốt. Nhưng, tôi không chắc chắn cách tốt nhất để làm điều này.

cách tiếp cận ngây thơ của tôi sẽ chỉ được điều này:

json_string = '[{"asset_created": null, "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "<script></script>"}]' 
escaped_json_string = json_string.replace('</', r'<\/') 

Có cách nào tốt hơn? Hoặc bất kỳ gotchas mà tôi nhìn?

Trả lời

6

Cập nhật trả lời

Được rồi tôi cho rằng một vài điều không chính xác. Để thoát JSON, thư viện simplejson có phương thức JSONEncoderForHTML hơn có thể được sử dụng. Bạn có thể cần phải cài đặt nó qua pip hoặc easy_install nếu mã không hoạt động. Sau đó, bạn có thể làm một cái gì đó như thế này:

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

encoded sẽ cung cấp cho bạn điều này:

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

Đây là một giải pháp tổng thể hơn dấu gạch chéo thay vì nó xử lý cẩn thận mã hóa khác.

Phần loads là tác dụng phụ của việc JSON đã được mã hóa. Điều này có thể tránh được bằng cách không sử dụng Django nếu có thể để tạo ra JSON và thay vào đó sử dụng simplejson:

simplejson.dumps(your_object_to_encode, cls=simplejson.encoder.JSONEncoderForHTML) 

Old trả lời

Hãy thử gói kịch bản của bạn trong CDATA:

<script> 
//<![CDATA[ 
var assets = [{ 
    "asset_created": null, 
    "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
    "body": "<script></script>" 
}]; 
//]]> 
</script> 

Nó có nghĩa là để gắn cờ trình phân tích cú pháp trên loại điều này. Nếu không, bạn sẽ cần phải sử dụng các ký tự thoát đã được đề cập.

+0

Nhưng điều này chỉ hoạt động cho XHTML, phải không? Với '' '', '' CDATA'' dường như không hoạt động. Đó là lý do tại sao tôi ưa thích '' \/'' thoát trong JSON. Câu hỏi đặt ra là làm thế nào để thay thế chuỗi ký tự thoát ra ngoài cách thoát khỏi văn bản. –

+0

@GeoffreyHing Ah vâng, tôi đã giả định không chính xác phần XHTML. Tôi đã cập nhật câu trả lời của tôi cho phần thoát khỏi DJango. – cwgem

+1

@GeoffreyHing: tàu django có bản sao riêng của simplejson mà bạn có thể nhập bằng cách sử dụng 'từ django.utils nhập simplejson', do đó bạn sẽ không cần cài đặt riêng biệt. –

Các vấn đề liên quan