Как правило, вы не можете представлять YAML как JSON, потому что JSON является подмножеством YAML.Например, теги и привязки YAML не могут быть выражены в JSON, а ограничения на ключи в объекте JSON чрезвычайно строги, тогда как YAML может иметь любой узел в качестве ключа в отображении.
Python может полностью представлять YAML, если неттогда ruamel.yaml
не может выполнить обход данных YAML.И поэтому вы можете генерировать все структуры данных YAML с нуля, используя обычные конструкции Python, а затем выводить их в YAML.Для помеченных конструкций это, однако, не совсем тривиально.Вы также должны учитывать, что ни одна библиотека не дает вам полного контроля над синтаксическим представлением, и отступы обычно одинаковы для всех отображений и всех последовательностей (или даже одинаковы для всех коллекций).
Если ваш YAML не 'Если в тегах, как в вашем примере, нет, то YAML может быть загружен как обычные конструкции Python, такие как dicts, списки и примитивы, такие как строки, целые числа, float, datetime.datetime, boolean.Вы можете просто загрузить YAML и распечатать структуру данных:
import sys
import ruamel.yaml
yaml_str = """---
- hosts: webservers
remote_user: root
gather_facts: true
tasks:
- name: ensure apache is at the latest version
yum:
name: httpd
state: latest
- name: write the apache config file
template:
src: /srv/httpd.j2
dest: /etc/httpd.conf
"""
yaml = ruamel.yaml.YAML(typ='safe')
data = yaml.load(yaml_str)
print(data)
, что дает:
[{'hosts': 'webservers', 'remote_user': 'root', 'gather_facts': True, 'tasks': [{'name': 'ensure apache is at the latest version', 'yum': {'name': 'httpd', 'state': 'latest'}}, {'name': 'write the apache config file', 'template': {'src': '/srv/httpd.j2', 'dest': '/etc/httpd.conf'}}]}]