Python aplanar JSON multinivel

Estoy tratando de convertir JSON a CSV, que puedo usar para un análisis más detallado. El problema con mi estructura es que tengo muchos dictados / listas nesteds cuando convierto mi archivo JSON.

Intenté usar pandas json_normalize() , pero solo aplana el primer nivel.

 import json import pandas as pd from pandas.io.json import json_normalize from cs import CloudStack api_key = xxxx secret = xxxx endpoint = xxxx cs = CloudStack(endpoint=endpoint, key=api_key, secret=secret) virtual_machines = cs.virtMach() test = json_normalize(virtual_machines["virtualmachine"]) test.to_csv("test.csv", sep="|", index=False) 

¿Alguna idea de cómo halagar todo el archivo JSON, de modo que pueda crear una entrada de línea única al archivo CSV para una entrada única (en este caso máquina virtual)? He intentado un par de soluciones publicadas aquí, pero mi resultado siempre fue solo el primer nivel fue aplanado.

Esta es una muestra de JSON (en este caso, todavía obtengo la salida “securitygroup” y “nic” en formato JSON:

 { "count": 13, "virtualmachine": [ { "id": "1082e2ed-ff66-40b1-a41b-26061afd4a0b", "name": "test-2", "displayname": "test-2", "securitygroup": [ { "id": "9e649fbc-3e64-4395-9629-5e1215b34e58", "name": "test", "tags": [] } ], "nic": [ { "id": "79568b14-b377-4d4f-b024-87dc22492b8e", "networkid": "05c0e278-7ab4-4a6d-aa9c-3158620b6471" }, { "id": "3d7f2818-1f19-46e7-aa98-956526c5b1ad", "networkid": "b4648cfd-0795-43fc-9e50-6ee9ddefc5bd" "traffictype": "Guest" } ], "hypervisor": "KVM", "affinitygroup": [], "isdynamicallyscalable": false } ] } 

Gracias y un cordial saludo, Bostjan

Gracias a gyx-hh, esto se ha resuelto:

Usé la siguiente función (los detalles se pueden encontrar aquí ):

 def flatten_json(y): out = {} def flatten(x, name=''): if type(x) is dict: for a in x: flatten(x[a], name + a + '_') elif type(x) is list: i = 0 for a in x: flatten(a, name + str(i) + '_') i += 1 else: out[name[:-1]] = x flatten(y) return out 

Desafortunadamente, esto aplana completamente todo JSON, lo que significa que si tiene JSON de varios niveles (muchos diccionarios nesteds), podría aplanar todo en una sola línea con toneladas de columnas.

Lo que usé al final fue json_normalize() y la estructura especificada que necesitaba. Un buen ejemplo de cómo hacerlo de esta manera se puede encontrar aquí .

Esperemos que esto ayude a alguien y una vez más, gracias a gyx-hh por la solución.

Atentamente