11

例如,我有一个 JSON 文件

{
    "Google":{
    "Web":"www.web.de",
    "Apps":{
        "Drive": "DriveLink",
        "Dropbox": "DropboxLink"
    },
    "Google Main":"http://mail.google.com",
    "G+":"http://plus.google.com"
    },  
    "Social":{
    "Facebook":"http://www.facebook.de",
    "G+":"https://plus.google.com",
    "Xing":"http://www.xing.de",
    "LinkedIn":"http://www.linkedin.com",
    "Tumblr":"http://www.tumblr.com"
    },
    "Fun":{
    "Reddit":"http://www.reddit.com"
    }
}

如您所见,我在 Google 部分下有一个名为 Apps 的嵌套部分

使用 CherryPy,我交出这个 JSON 对象,名称如下:

@cherrypy.expose
def index(self):
    linksFile = open('links.json', 'r')
    linksList = json.load(linksFile) 

    template = jinjaEnv.get_template('index.html')
    return template.render(linksList=linksList)

我想要的是呈现以下内容:

  1. 谷歌
    • 网络(作为链接)
    • 谷歌主
    • G+
    • 应用
      • 驾驶
      • 投递箱
  2. 社会的
    • Facebook
    • G+

等等

我不明白的是要递归地渲染这个嵌套的对象,比如“Apps”

4

2 回答 2

16

文档内容如下:

可以递归地使用循环。如果您正在处理诸如站点地图之类的递归数据,这将非常有用。要递归地使用循环,您基本上必须将递归修饰符添加到循环定义中,并使用要递归的新迭代调用循环变量。

在您的情况下,这将通过以下方式完成:

<ul>
{% for key, value in linksList.items() recursive %}
    <li>
    {% if value is string %}
        <a href="{{ value }}">{{ key }}</a>
    {% else %}
        {{ key }}
        <ul>{{ loop(value.items()) }}</ul>
    {% endif %}
    </li>
{% endfor %}
</ul>
于 2012-08-12T16:42:54.403 回答
3

我的 2 美分,如果有人来这里寻找使用 Jinja 渲染 JSON并补充来自@Ryon Sherman 的响应:)

  1. 由于 JSON 可能具有 int 值和字符串,因此您可以使用if value is mapping(并翻转 if 条件)
  2. 如果您的输出必须感觉像 JSON,您可以使用{{key|indent(width)}}+loop.depth
  3. 在我的情况下,模板是用于电子邮件的,key|indent()没有按预期工作,所以我最终使用了一个辅助{% for %}循环:
<div>
    <code>{
    {% for key, value in dic.items() recursive %}
    {% if value is mapping %}
    <p>
     {% for it in range(loop.depth) %}&nbsp;&nbsp;{% endfor %}{{key}}: {
    </p>
    {{ loop(value.items()) }}
    <p>
      {% for it in range(loop.depth) %}&nbsp;&nbsp;{% endfor %}}
    </p>
    {% else %}
    <p>
      {% for it in range(loop.depth) %}&nbsp;&nbsp;{% endfor %}{{key}}: {{value}},
    </p>
    {% endif %}
    {% endfor %}
    }</code>
</div>
于 2019-04-04T15:19:15.720 回答