使用Django访问JSON数据

1 投票
2 回答
2281 浏览
提问于 2025-04-17 19:25

免责声明:我对解析和访问JSON完全是新手,刚开始学习django。

详情:

我想在django模板中访问一些JSON对象里的数据:

示例JSON:

{"entry":[
{"id":"1234567","hash":"1234567",
..."name":{"givenName":"John","familyName":"Doel","formatted":"John H. Doe"},
..."currentLocation":"Los Angeles, CA",
..."emails":[{"primary":"true","value":"jdoe@example.com"}],
..."accounts":[
    ...{"domain":"facebook.com","url":"http:\/\/www.facebook.com\/john.doe",..."shortname":"facebook"},
    ...{"domain":"twitter.com","display":"@jdoe411","url":"http:\/\/twitter.com\/jdoe411",..."shortname":"twitter"}],
..."urls":[{"value":"http:\/\/www.example.com","title":"example url"},]}
]}

通过Django模板标签获取:

@register.inclusion_tag('includes/gravatar_links.html')
def gravatar_links(email, first_name):
    url = "http://www.gravatar.com/" + hashlib.md5(email.lower()).hexdigest()
    url += '.json'

    response = urllib2.urlopen(url)
    interm = simplejson.load(response)
    data = simplejson.dumps(interm)
    name = first_name

return {'gravatar_links': {'name': name, 'data': data}}

我只需要调用 {{ gravatar_links.name }}{{ gravatar_links.data }},就能看到用户的名字和描述的JSON数据。

目标:

我想访问JSON对象中特定的键,也就是 "accounts""urls",并自定义输出,比如说 "关注 {{ gravatar_links.name }} 在 <a href="{{ gravatar_links.data.accounts.url }}">{{ gravatar_links.data.accounts.shortname }}</a> 上,查看他们的作品在 <a href="{{ gravatar_links.data.urls.url }}">{{ gravatar_links.data.urls.title }}</a>"

理想情况下,这样会生成:

"关注John在Twitter和Facebook,查看他们的作品在example url"

问题:

  1. 我应该只用django/python来做这个,还是用jQuery更好?
  2. 如果 "accounts" 是一个列表,我该如何将其输出为用逗号分隔的列表?
  3. 使用这种方法是否有任何安全问题我需要注意?

2 个回答

0

对于你用逗号分隔的列表,你可以使用Django里的join模板标签(可以参考这个链接了解更多:https://docs.djangoproject.com/en/dev/ref/templates/builtins/)。

{{ accounts|join:", " }}

如果你想让它更酷一点,你还可以自己写一个模板标签(其实并没有想象中那么难!)。

0

模板标签应该是:

@register.inclusion_tag('includes/gravatar_links.html')
def gravatar_links(email, first_name):
    url = "http://www.gravatar.com/" + hashlib.md5(email.lower()).hexdigest()
    url += '.json'

    response = urllib2.urlopen(url)
    interm = simplejson.load(response)
    accounts_list = interm["entry"][0]["accounts"]
    data = simplejson.dumps(interm)

    return {'gravatar_links': {'accounts': accounts_list, 'name': first_name, 'data': data}}

然后,要访问这个json对象里的元素,我们可以继续使用类似 accounts_list = interm["entry"][0]["accounts"] 的方式,不过如果是 "urls",我们就用 urls_list = interm["entry"][0]["urls"]

如果某个元素有多个可能的 字典,比如 [元素: {键1=>值1, ...}, {键2=>值2, ...}],那么在你的模板里设置一个循环,像这样遍历这些项目:

and follow {{ gravatar_links.name }} on 

{% for o in gravatar_links.accounts %}
    {% if not forloop.first and not forloop.last %}, {% endif %}
    {% if forloop.last %} and {% endif %}

    <a href="{{ o.url }}">{{ o.shortname }}</a>

    {% if forloop.last %}.{% endif %}
{% endfor %} 

额外的 if forloop 语句会帮助我们生成输出:

并在facebook和twitter上关注John。

如果有超过两个网址:

并在facebook、linkedin和twitter上关注John。

撰写回答