使用Flask访问Json和Jinja2中的内部最佳设置

时间:2014-05-27 19:09:44

标签: python json flask jinja2

使用返回JSON的API,我无法弄清楚如何访问值的最内层元素。我剩下的是一个单一的键和值,这是所有的数据。

{
  "results": [
    {
      "DataverseName": "Metadata",
      "DatatypeName": "NodeGroupRecordType",
      "Derived": {
        "Tag": "RECORD",
        "IsAnonymous": false,
        "EnumValues": null,
        "Record": {
          "IsOpen": true,
          "Fields": {
            orderedlist: [
              {
                "FieldName": "GroupName",
                "FieldType": "string"
              },
              {
                "FieldName": "NodeNames",
                "FieldType": "Field_NodeNames_in_NodeGroupRecordType"
              },
              {
                "FieldName": "Timestamp",
                "FieldType": "string"
              }
            ]
          }
        },
        "Union": null,
        "UnorderedList": null,
        "OrderedList": null
      },
      "Timestamp": "Wed Apr 30 15:55:24 PDT 2014"
    }
  ]
}

我正在尝试访问集orderedlist并需要获取FieldName的值。在python中,我使用的是SimpleJson,当迭代结果时,一切都是混在一起。我是否必须重新编码JSON,以便值现在是键,并一直持续到ordredlist

的Python:

j = json.loads(response.text)
return render_template('fields.html', response=j, dataverse=dataset)

HTML / JinJa2

{% for key, value in response.items() %}
    {% for items in value %}
        {{ items }}
    {% endfor %}
{% endfor %}

1 个答案:

答案 0 :(得分:0)

由于您的问题与从Jinja2模板访问内部数据结构有关,我简化了我的示例(忽略了Flask的内容)。将我的答案应用于Flask将是微不足道的。

首先,您的JSON数据无效,我必须更正orderedlist并将其"括起来,并将l设置为大写,结束"orderedList"

然后,从Jinja2访问数据很有趣 - 您可以使用点表示法访问它(但也可以使用[“SomeName”]。请注意,如果您要求的数据不存在,Jinja2将隐藏许多问题。应该从外层结构一步一步地玩你的模板,你会得到你想要的东西。

from jinja2 import Template
import json

response_text = """
{
  "results": [
    {
      "DataverseName": "Metadata",
      "DatatypeName": "NodeGroupRecordType",
      "Derived": {
        "Tag": "RECORD",
        "IsAnonymous": false,
        "EnumValues": null,
        "Record": {
          "IsOpen": true,
          "Fields": {
            "orderedList": [
              {
                "FieldName": "GroupName",
                "FieldType": "string"
              },
              {
                "FieldName": "NodeNames",
                "FieldType": "Field_NodeNames_in_NodeGroupRecordType"
              },
              {
                "FieldName": "Timestamp",
                "FieldType": "string"
              }
            ]
          }
        },
        "Union": null,
        "UnorderedList": null,
        "OrderedList": null
      },
      "Timestamp": "Wed Apr 30 15:55:24 PDT 2014"
    }
  ]
}
"""

data = json.loads(response_text)

templ_str = """
{% for rec in data.results %}
    Results: -------------
    {% for fldinfo in rec.Derived.Record.Fields.orderedList %}
        Field: Name: {{fldinfo.FieldName}} Type: {{fldinfo.FieldType}}
    {% endfor %}
{% endfor %}
"""

template = Template(templ_str)
print template.render(data=data)

运行它我们得到:

Results: -------------

    Field: Name: GroupName Type: string

    Field: Name: NodeNames Type: Field_NodeNames_in_NodeGroupRecordType

    Field: Name: Timestamp Type: string