首页 > 解决方案 > Jinja 解析嵌套的 JSON

问题描述

这是我第一次尝试使用 Jinja 或任何与 Python 相关的东西,但是我们的供应商已经实现了一个使用它的新工具,所以我们到了。

作为测试,我使用免费的 API 作为数据源,并希望通过该工具的 Jinja 对其进行转换。API 是http://www.floatrates.com/daily/usd.json ...

{"eur":{
    "code":"EUR",
    "alphaCode":"EUR",
    "numericCode":"978",
    "name":"Euro",
    "rate":0.90140326265491,
    "date":"Tue, 21 Jan 2020 12:00:01 GMT",
    "inverseRate":1.1093813850359},
"gbp":{
    "code":"GBP",
    "alphaCode":"GBP",
    "numericCode":"826",
    "name":"U.K. Pound Sterling",
    "rate":0.76735727130961,
    "date":"Tue, 21 Jan 2020 12:00:01 GMT",
    "inverseRate":1.3031739417721},
"jpy":{
    "code":"JPY",
    "alphaCode":"JPY",
    "numericCode":"392",
    "name":"Japanese Yen",
    "rate":109.99188913429,
    "date":"Tue, 21 Jan 2020 12:00:01 GMT",
    "inverseRate":0.009091579459819}...

我的目标是遍历内容(该工具在 content 属性中具有响应的主体)并获取每个内容的代码和最终速率。一旦我能够成功获得这些价值观,我就知道该怎么做......这是我到目前为止所拥有的

{% set Collection = a.content|to_json %}
{% for obj in Collection %}
{% set CurrentObject = obj %}
{{ Collection[CurrentObject].code }}
{% endfor %}

但是,这似乎不起作用...如果我执行 a.content|to_json['eur'].code 那么我将 EUR 作为一个值,但我试图不对每次迭代进行硬编码。

提前致谢。

标签: jsonjinja2

解决方案


我不认为你想要那个to_json过滤器。这是为了生成数据结构的 JSON 表示。你不想要那个;你实际上想要数据结构。

如果您在content属性中的问题中有数据,则可以编写如下内容:

{% for code in content %}
{{ code }} {{ content[code].rate }}
{% endfor %}

这会给你:

eur 0.90140326265491

gbp 0.76735727130961

jpy 109.99188913429

这是我用来测试的代码:

import jinja2


content = {
    "eur": {
        "code": "EUR",
        "alphaCode": "EUR",
        "numericCode": "978",
        "name": "Euro",
        "rate": 0.90140326265491,
        "date": "Tue, 21 Jan 2020 12:00:01 GMT",
        "inverseRate": 1.1093813850359,
    },
    "gbp": {
        "code": "GBP",
        "alphaCode": "GBP",
        "numericCode": "826",
        "name": "U.K. Pound Sterling",
        "rate": 0.76735727130961,
        "date": "Tue, 21 Jan 2020 12:00:01 GMT",
        "inverseRate": 1.3031739417721,
    },
    "jpy": {
        "code": "JPY",
        "alphaCode": "JPY",
        "numericCode": "392",
        "name": "Japanese Yen",
        "rate": 109.99188913429,
        "date": "Tue, 21 Jan 2020 12:00:01 GMT",
        "inverseRate": 0.009091579459819,
    },
}


t = jinja2.Template('''{% for code in content %}
{{ code }} {{ content[code].rate }}
{% endfor %}''')

print(t.render(content=content))

推荐阅读