Django:在模板中使用JavaScript解析JSON
我在我的视图中有这个:
string_location = myaddress2
geodata = []
for place, (lat, lng) in g.geocode(string_location,exactly_one=False):
geodata.append((place, (lat, lng)))
geodata_results = len(geodata)
data = {"geodata": geodata, "geodata_results":geodata_results }
return render_to_response("business/business_view.html",
data, context_instance=RequestContext(request))
我该如何把 地理数据 转换成 JSON 格式,并传递给我的模板,这样我就可以像处理数组一样“循环”它呢?
我这样想是对的吗?如果不对,请给我建议一个更好的解决方案。
谢谢!
更新
var geodata = "[["M. L. Quezon Street<br/>Mandaue City, Philippines", [10.351381999999999, 123.923535]], ["Talamban<br/>Cebu City, Philippines", [10.353527, 123.91352500000001]]]";
我觉得这个 JSON 没有被转义?我该如何在 JSON 字符串中转义特殊字符呢?我总是遇到换行错误。
在 PHP 中,我会用 json_encode() 来解决这个问题。就像这篇文章中提到的:将 PHP 字符串传递给 JavaScript 变量(并转义换行符),但是在 Python/Django 中我该怎么做呢?
5 个回答
如果你不在乎像IE7这样的老旧浏览器,你可以简单地写:
var geodata = JSON.parse("{{geodata|escapejs}}");
这样就不需要额外的库了。你可以查看一下这个链接 http://caniuse.com/#feat=json,里面有支持JSON.parse()的浏览器版本信息。
我觉得@adamk的高票回答可能有XSS安全问题。如果JSON里包含了 "</script>"
,浏览器会把它当作 <script>
标签的结束符。所以用@wenbert的代码或者我自己的代码会更好。
我想直接在答案下评论,但我的声望不够,不能这样做 :)
好的,我解决了我的问题,想要回答我自己的问题。我觉得这样对其他用户会更有帮助。
首先,去这里下载文件:http://www.JSON.org/json_parse.js
var geodata = json_parse("{{geodata|escapejs}}");
我使用了 escapejs:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#escapejs
补充一下:感谢 Ignacio Vazquez-Abrams。他在 #python Freenode 帮助了我。我应该在发这个帖子的时候提到他。我不知道他也在 Stackoverflow。
你可以使用内置的 json
模块:
>>> import json
>>> geodata = [ ( "Here", (1003,3004) ), ("There", (1.2,1.3)) ]
>>> json.dumps(geodata)
'[["Here", [1003, 3004]], ["There", [1.2, 1.3]]]'
然后你可以很简单地把得到的字符串放到一个javascript脚本里:
<script type='text/javascript'>
var geodata = {{ geodata|safe }};
</script>