我已经使用jinja2创建了一个模板,该模板可以按预期生成输出。
但是,我正在尝试从生成的JSON的最后一个对象中删除逗号。
我尝试使用python: 3.6.3.final.0
python-bits: 64
OS: Darwin
OS-release: 16.7.0
LOCALE: en_US.UTF-8
pandas: 0.23.0
来摆脱最后一个对象的逗号。
但是,我无法获得正确的输出。
{% if loop.last %}
下面是代码和输出
{% if loop.last %}
{
"met" : {{j}},
"uri" : "{{i}}"
}
{% endif %}
输出:
from jinja2 import Template
uri = ["example1.com","example2.com"]
metric_value = [1024, 2048]
template = Template('''\
[
{%- for i in uri -%}
{%- for j in met %}
{
"met" : {{j}},
"uri" : "{{i}}"
},
{%- endfor -%}
{%- endfor %}
]
''')
payload = template.render(uri=uri, met=metric_value)
print(payload)
答案 0 :(得分:2)
不要使用Jinja2手动生成JSON 。您不能希望在所有情况下都能生成保存和有效的JSON。
将JSON嵌入较大的模板时,请使用tojson
built-in filter生成JSON。它不会包含结尾逗号。
我将两个列表的乘积传递成现成的字典:
uri_per_metric = [{'met': m, 'uri': u} for u in uri for m in metric_value]
在模板中只需使用
{{ uri_per_metric|tojson(indent=4) }}
演示:
>>> from jinja2 import Template
>>> uri = ["example1.com", "example2.com"]
>>> metric_value = [1024, 2048]
>>> uri_per_metric = [{'met': m, 'uri': u} for u in uri for m in metric_value]
>>> template = Template('''\
... <script type="text/javascript">
... data = {{ uri_per_metric|tojson(indent=4) }};
... </script>
... ''')
>>> payload = template.render(uri_per_metric=uri_per_metric)
>>> print(payload)
<script type="text/javascript">
data = [
{
"met": 1024,
"uri": "example1.com"
},
{
"met": 2048,
"uri": "example1.com"
},
{
"met": 1024,
"uri": "example2.com"
},
{
"met": 2048,
"uri": "example2.com"
}
];
</script>
当然,如果您正在生成application/json
响应(从Web终结点返回 JSON数据)并且它不是更大模板的一部分,则可以使用模板化根本不是一个好主意。在这种情况下,请使用您的Web框架可能具有的专用JSON支持,例如Flask's jsonify()
response factory method,或直接使用json.dumps()
产生输出。