Удалить запятую из последнего объекта объекта JSON - PullRequest
0 голосов
/ 01 ноября 2018

Я создал шаблон, используя jinja2, который генерирует вывод, как и ожидалось.

Однако я пытаюсь удалить запятую из последнего объекта сгенерированного JSON. Я пытался использовать {% 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)

выход:

[
    {
        "met" : 1024,
        "uri" : "example1.com"
    },
    {
        "met" : 2048,
        "uri" : "example1.com"
    },
    {
        "met" : 1024,
        "uri" : "example2.com"
    },
    {
        "met" : 2048,
        "uri" : "example2.com"
    },
]

1 Ответ

0 голосов
/ 01 ноября 2018

Не генерировать JSON вручную с Jinja2 . Вы не можете надеяться на создание сохраненного и действительного JSON при любых обстоятельствах.

При встраивании JSON в шаблон большего размера используйте встроенный фильтр tojson для создания 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 (возвращающий только данные JSON из веб-конечной точки), и это не является частью большого шаблона, тогда вообще используйте шаблон 1023 * было бы плохой идеей. В этом случае используйте выделенную поддержку JSON, которую может иметь ваша веб-инфраструктура, такую ​​как метод фабрики ответов jsonify() Flask , или создайте вывод с помощью json.dumps() напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...