def hdf2dict(hdf_as_str): """ Usage >>> json_data = hdf2json('''artists { ... 0 { ... name = Persuader, The ... } ... } ... title = Stockholm ... labels { ... 0 { ... name = Svek ... catno = SK032 ... } ... }''') """ if not isinstance(hdf_as_str, basestring): raise ValueError('argument must be a string') hdf_obj = HDF() hdf_obj.readString(hdf_as_str) node = hdf_obj def traverse_node(node): dict_part = {} list_part = [] while node and node.name().isdigit(): if node.value(): list_part.append(node.value()) else: list_part.append(traverse_node(node.child())) node = node.next() if list_part: return list_part while node: if node.value() is not None and not node.child(): val = node.value() dict_part[node.name()] = val else: dict_part[node.name()] = traverse_node(node.child()) node = node.next() return dict_part return traverse_node(node.child())