Jinja2 и Json

у меня есть, например, файл 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 следующим образом с именем linksList:

@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. Google
    • Web (как ссылка)
    • Google Главная
    • G+
    • приложения
      • диск
      • в Dropbox
  2. социальные
    • Facebook
    • G+
    • Xing

и так далее

то, что я не понимаю, это сделать, это сделать это вложенные объекты, такие как "приложения" рекурсивно

1 ответов


на документация гласит:

можно использовать циклы рекурсивно. Это полезно, если вы работа с рекурсивными данными, такими как sitemaps. Рекурсивное использование циклов вы в основном должны добавить рекурсивный модификатор в цикл определение и вызов переменной цикла с новой iterable, где вы хочу повторить.

в вашем случае это будет достигнуто следующим образом:

<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>