¿Convertir cadena a diccionario ordenado?

Tengo una cadena que básicamente contiene un montón de texto con formato JSON que finalmente me gustaría exportar a Excel en formato “bastante impreso” con las muescas adecuadas para anidar, etc.

Es imperativo que el orden original de las claves / valores se conserve por motivos de legibilidad. Mi proceso de pensamiento para lograr lo que quiero es

a) use algo como eval para convertir la cadena a un diccionario y b) use OrderedDict de la biblioteca de colecciones para mantener el orden intacto.

Sin embargo no estoy obteniendo el resultado esperado:

In [21]: json_string = str({"id":"0","last_modified":"undefined"}) In [22]: OrderedDict(eval(json_string)) Out[23]: OrderedDict([('last_modified', 'undefined'), ('id', '0')]) 

Todavía no me he dado cuenta de cómo voy a escribir la salida para excel en un bonito formato de impresión, ¡pero espero que esa sea la parte relativamente fácil!

Puede usar el argumento object_pairs_hook para JSONDecoder para cambiar los diccionarios descodificados a OrderedDict:

 import collections import json decoder = json.JSONDecoder(object_pairs_hook=collections.OrderedDict) json_string = '{"id":"0","last_modified":"undefined"}' print decoder.decode(json_string) json_string = '{"last_modified":"undefined","id":"0"}' print decoder.decode(json_string) 

Esto imprime:

 OrderedDict([(u'id', u'0'), (u'last_modified', u'undefined')]) OrderedDict([(u'last_modified', u'undefined'), (u'id', u'0')]) 

Primero, debes considerar usar json (o incluso ast.literal_eval ) en lugar de eval .

En segundo lugar, esto no funcionará porque en el momento en que lo convierta en un diccionario normal, se perderá todo el orden. Deberá analizar el “json” usted mismo si desea colocar la información en un OrderedDict.

Afortunadamente, esto no es tan difícil como podría pensar si usa el módulo ast . Aquí asumo que el diccionario solo contiene cadenas, pero no debería ser demasiado difícil de modificar para otros propósitos.

 s = '{"id":"0","last_modified":"undefined"}' import ast from collections import OrderedDict class DictParser(ast.NodeVisitor): def visit_Dict(self,node): keys,values = node.keys,node.values keys = [ns for n in node.keys] values = [ns for n in node.values] self.od = OrderedDict(zip(keys,values)) dp = DictParser() dp.visit(ast.parse(s)) ordered_dict = dp.od print ordered_dict 

Esta publicación está relacionada con la conversión de cadena a ordenada con manipulación de cadena:

https://stackoverflow.com/a/27177986/1128709