Только YAML 1.2 является расширенным набором JSON, YAML 1.1 - нет, и, хотя YAML 1.2 был выпущен в 2009 году, к сожалению, PyYAML с тех пор не обновлялся.Ваш пример - это подмножество JSON, совместимое с YAML 1.1, но в общем случае не стоит пытаться использовать для этого PyYAML.
Существуют и другие нативные библиотеки для Python, другая - ruamel.yaml
(отказ от ответственности: я являюсь автором этого пакета), и он реализует YAML 1.2 и дает вам полный контроль над дампированием блоков и стилей потока отдельных коллекций.Конечно, у вас все еще есть общее ограничение YAML, что вы не можете иметь коллекцию стилей блоков в коллекции стилей потока).
PyYAML и ruamel.yaml в режиме non-round-trip-only, разрешают тольковесь блок, или весь поток, или весь блок с конечными узлами в стиле потока.Но по умолчанию режим туда-обратно позволяет более детализированное управление с использованием атрибута .fa
для коллекций:
import sys
import json
import ruamel.yaml
original_json = {'a': {'next': ['b'], 'prev': []},
'b': {'next': ['c'], 'prev': ['a']},
'c': {'next': ['d', 'e'], 'prev': ['b']},
'd': {'next': [], 'prev': ['c']},
'e': {'next': ['f'], 'prev': ['c']},
'f': {'next': [], 'prev': ['e']}}
json_string = json.dumps(original_json)
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
# yaml.preserve_quotes = True
data = yaml.load(json_string)
# the following sets flow-style for the root level mapping only
data.fa.set_block_style()
yaml.dump(data, sys.stdout)
, что дает:
a: {next: [b], prev: []}
b: {next: [c], prev: [a]}
c: {next: [d, e], prev: [b]}
d: {next: [], prev: [c]}
e: {next: [f], prev: [c]}
f: {next: [], prev: [e]}
, который вы, конечно, можете рекурсивно пройтисвою структуру данных и звоните .fa.set_block_style()
в зависимости от любых критериев, которые вы хотите.