2012-01-03 29 views
11

Tôi sử dụng Jinja2 với webapp2.JSON xuất hiện dưới dạng các đối tượng unicode trong mẫu Jinja2

Jinja2 mã hóa tất cả dữ liệu 'bối cảnh' thành unicode như tài liệu của chúng cho biết. Này được chứng minh có vấn đề khi tôi cố gắng để chèn một chuỗi json vào mẫu:

jsonData = json.loads(get_the_file('catsJson.txt')) 

tôi vượt qua jsonData để mẫu và tôi có thể lặp nó thành công nhưng khi tôi chèn một yếu tố json vào HTML, có vẻ như thế này:

<option value='[u&#39;dogs&#39;, u&#39;cats&#39;]'> 

tôi muốn nó trông như thế này (vì nó là trong chuỗi json gốc):

<option value='["dogs", "cats"]'> 

Bất kỳ lời đề nghị?

Trả lời

21

Bạn phải lọc giá trị thông qua bộ lọc safe để thông báo cho jinja2 rằng bộ lọc không nên áp dụng bất kỳ bộ lọc nào khác cho đầu ra. Trong cú pháp jinja2 này sẽ là:

{{ jsonData | safe }} 

Lưu ý rằng kể từ khi bạn đang gọi json.loads bạn thực sự không có dữ liệu json nữa, bạn có một đối tượng danh sách python. Vì vậy, khi nó được tuần tự hóa, nó giống như gọi số unicode(['dogs', 'cats']) sẽ cung cấp cho bạn tiền tố u của bạn. Bạn có thể không muốn phân tích cú pháp dữ liệu json hoặc bạn sẽ cần phải biến danh sách thành chuỗi theo cách thủ công thay vì có jinja2 làm điều đó cho bạn.

+2

bây giờ nó kết quả đầu ra: '[u'dogs', u'cats']' Làm thế nào để loại bỏ các tiền tố u? – ofko

+0

Chuyển đổi các phần tử mảng thành 'str':' map (str, jsonData) ' – Xion

+0

câu trả lời được cập nhật, bạn cho phép jinja2 biến danh sách python thành chuỗi, vì vậy nó kết thúc bằng cách sử dụng biểu diễn chuỗi của danh sách. –

-1

Trong Jinja 2.9 tôi theo lời khuyên của Xion @ lần đầu tiên để chuyển đổi các phần tử có thể lặp lại thành chuỗi bằng cách sử dụng map('string'). Kết quả bộ lọc bản đồ sau đó tôi chuyển đổi thành danh sách cuối cùng được xuất dưới dạng JSON bằng cách sử dụng bộ lọc được tích hợp sẵn tojson.

{{ jsonData|map('string')|list|tojson }} 
Các vấn đề liên quan