Aplanar JSON en Python
Este tutorial analizará el aplanamiento de JSON mediante sentencias condicionales, bucles y la función type()
en Python.
Aplanar JSON en Python
JSON es un formato de archivo y significa Notación de objetos de JavaScript. JSON almacena y transmite datos que un humano puede leer y comprender.
Vemos diferentes atributos con valores separados por matrices o listas en un archivo JSON. Por ejemplo, podemos usar un archivo JSON para almacenar datos de estudiantes como su nombre, edad, dirección y clase.
Los datos de cada estudiante se almacenarán en una matriz que contiene atributos y valores de diferentes tipos de datos. Por ejemplo, a continuación se proporciona un archivo JSON de ejemplo.
{"Ali" : {
"age": 18,
"profession": "student"},
"Ammar" : {
"age" : "nineteen",
"profession": "mechanic"}
}
El archivo anterior contiene información sobre dos personas, que podemos leer usando la biblioteca json
de Python. Por ejemplo, lea el archivo anterior usando la biblioteca json
y visualice su contenido.
Vea el código a continuación.
import json
json_file = open("people.json")
data = json.load(json_file)
print("Original Data\n", data)
Producción :
Original Data
{'Ali': {'age': 18, 'profession': 'student'}, 'Ammar': {'age': 'nineteen', 'profession': 'mechanic'}}
Tenemos que proporcionar el nombre del archivo y su extensión en la función open()
para leerlo, y si el archivo no está en el mismo directorio que el archivo de Python, tenemos que proporcionar la ruta completa del archivo junto con su nombre y extensión dentro de la función open()
. Usamos la función cargar ()
de la biblioteca json
para leer los datos JSON.
Podemos obtener los datos de una sola persona usando su nombre dentro de la variable de datos como datos['Ali']
. Si tenemos un archivo JSON multinivel que contiene una gran cantidad de datos, se vuelve difícil leer el valor de un atributo específico.
Dentro de un archivo JSON multinivel, tenemos atributos dentro de otros atributos como listas o dicts
. Podemos combinar nombres de atributos si queremos convertir el archivo JSON multinivel a un solo nivel.
Por ejemplo, en el código anterior, si queremos obtener la edad de Ali
, podemos acceder usando data['Ali']['age']
, pero si combinamos los nombres de los atributos, podemos usar data['Ali_age']
para obtener la edad de Ali
.
Podemos usar una función recursiva que se llamará a sí misma varias veces para aplanar los datos JSON. Tenemos que leer los datos del archivo JSON y usar dos bucles para buscar lista
y dict
en los datos.
Usaremos bucles para combinar los nombres de los atributos con un delimitador y guardar su valor en formato dict
. Los bucles se detendrán cuando no haya más datos en el archivo JSON y se devolverá el resultado.
Por ejemplo, aplanemos el archivo JSON anterior. Vea el código a continuación.
import json
json_file = open("people.json")
data = json.load(json_file)
print("Original Data\n", data)
def flatten_json_data(json_data):
out = {}
def flatten_json(d, name=""):
if type(d) is dict:
for a in d:
flatten_json(d[a], name + a + "_")
elif type(d) is list:
i = 0
for a in d:
flatten_json(a, name + str(i) + "_")
i += 1
else:
out[name[:-1]] = d
flatten_json(json_data)
return out
flattened_data = flatten_json_data(data)
print("\nflatten Data\n", flattened_data)
Producción :
Original Data
{'Ali': {'age': 18, 'profession': 'student'}, 'Ammar': {'age': 'nineteen', 'profession': 'mechanic'}}
flatten Data
{'Ali_age': 18, 'Ali_profession': 'student', 'Ammar_age': 'nineteen', 'Ammar_profession': 'mechanic'}
En el código anterior, usamos la declaración condicional if-else
para verificar el tipo de datos de entrada y la función type()
, que devuelve el tipo de datos de los objetos. Durante la lectura de los datos, si aparece un dict
, el primer ciclo funcionará; si llega una lista, el segundo bucle funcionará.
En el resultado anterior, podemos ver que los datos originales contienen dos dicts
, pero los datos aplanados contienen solo un dict
. El archivo JSON de ejemplo no contiene listas, pero el código anterior también funcionará con archivos JSON que contengan listas.
Hay una diferencia entre los datos originales y los datos aplanados; podemos obtener la edad y la profesión de una persona al mismo tiempo usando los datos originales porque la edad y la profesión tienen el mismo atributo principal, que es el nombre de la persona, pero no podemos hacer lo mismo usando los datos aplanados.
Para obtener la edad y la profesión de una persona utilizando los datos aplanados, tenemos que obtenerlos por separado uno por uno.
Un archivo JSON aplanado es útil cuando solo tenemos que obtener un único valor, pero podemos usar el archivo JSON original si queremos obtener toda la información sobre un objeto o atributo. Consulte este enlace para obtener más detalles sobre la biblioteca JSON.