Cómo funcionan los json y las funciones de serializar y convertir a texto

JSON, que significa JavaScript Object Notation, es un formato ligero para intercambiar datos. JSON es fácil de leer y escribir. Además, es fácil de generar y analizar para las máquinas. JSON es un formato de datos que tiene una sintaxis muy sencilla y en su forma básica define objetos (entre llaves {}) y arrays (entre corchetes []).

Un objeto JSON puede contener varios tipos de datos, como números, strings, booleanos, listas, objetos o null.

Aquí hay un ejemplo de un objeto JSON:

json
{
"nombre": "Juan",
"edad": 30,
"casado": false,
"hijos": ["Ana", "Luis"],
"mascotas": null,
"coche": {
"marca": "Ford",
"modelo": "Fiesta"
}
}

En muchos lenguajes de programación, existen métodos o funciones para serializar y deserializar JSON.

Serialización

Para serializar datos en formato JSON, puedes usar el método json.dumps(). Este método convierte los datos de Python en una cadena en formato JSON.

Aquí tienes un ejemplo:

python
import json

data = {
"nombre": "Juan",
"edad": 30,
"casado": False,
"hijos": ["Ana", "Luis"],
"mascotas": None,
"coche": {
"marca": "Ford",
"modelo": "Fiesta"
}
}

json_str = json.dumps(data)

print(json_str)
# Imprimirá:
# {"nombre": "Juan", "edad": 30, "casado": false, "hijos": ["Ana", "Luis"], "mascotas": null, "coche": {"marca": "Ford", "modelo": "Fiesta"}}

Deserialización

Para deserializar datos JSON, puedes usar el método json.loads(). Este método convierte una cadena en formato JSON en un objeto Python.

Aquí tienes un ejemplo:

python
import json

json_str = '{"nombre": "Juan", "edad": 30, "casado": false, "hijos": ["Ana", "Luis"], "mascotas": null, "coche": {"marca": "Ford", "modelo": "Fiesta"}}'

data = json.loads(json_str)

print(data)
# Imprimirá:
# {'nombre': 'Juan', 'edad': 30, 'casado': False, 'hijos': ['Ana', 'Luis'], 'mascotas': None, 'coche': {'marca': 'Ford', 'modelo': 'Fiesta'}}

Como puedes ver, los datos ahora están en un formato que Python puede trabajar, como diccionarios y listas.

La diferencia entre un objeto JSON y una cadena de texto (string) que representa un JSON es más que solo el carácter inicial. El objeto JSON es una estructura de datos, mientras que la cadena de texto es solo una representación de esa estructura.

Veamos las diferencias en más detalle:

  1. Tipo de dato: En Python, un objeto JSON es un tipo de dato nativo de Python (como un diccionario o una lista), mientras que una cadena JSON es una cadena de texto.
  2. Cómo se accede a los datos: Puedes acceder a los elementos de un objeto JSON usando la notación de punto o corchetes, como en objeto['clave'] en Python. Pero si intentas hacer esto con una cadena JSON, obtendrás un error, porque la cadena es solo texto y no tiene la estructura de los objetos o las listas.
  3. Cómo se ve: Los objetos JSON se visualizan como estructuras de datos, con llaves y corchetes. Las cadenas JSON se ven como texto, entre comillas, y todas las claves y valores están entre comillas.

Por ejemplo, considera el siguiente objeto JSON en Python:

python
data = {
"nombre": "Juan",
"edad": 30
}

Y la cadena JSON correspondiente:

python
json_str = '{"nombre": "Juan", "edad": 30}'

Si imprimes data['nombre'], obtendrás Juan, porque data es un objeto y puedes acceder a sus elementos. Pero si intentas imprimir json_str['nombre'], obtendrás un error, porque json_str es una cadena de texto, no un objeto.

Espero que esto aclare las diferencias entre un objeto JSON y una cadena JSON. La serialización y deserialización son procesos que nos permiten convertir entre estas dos formas, según nuestras necesidades.

 

El formato JSON no soporta todos los tipos de datos de Python. Los tipos de datos que pueden ser serializados a JSON incluyen diccionarios, listas, números, strings, booleanos y None. No puedes serializar otros tipos de datos más complejos, como conjuntos (sets), archivos o conexiones a bases de datos.

Cuando intentas serializar un conjunto (set), te encuentras con este error porque JSON no sabe cómo representar un conjunto.

Para resolver este problema, tendrías que convertir el conjunto a un tipo de datos que sea serializable. Por ejemplo, podrías convertir el conjunto a una lista:

python
import json

data = {
"nombre": "Juan",
"edad": 30,
"hobbies": {"fútbol", "cine", "música"} # Esto es un set
}

# Convertir el conjunto a una lista
data["hobbies"] = list(data["hobbies"])

json_str = json.dumps(data)

print(json_str)
# Imprimirá algo como:
# {"nombre": "Juan", "edad": 30, "hobbies": ["fútbol", "cine", "música"]}

De esta manera, puedes serializar tus datos sin problemas. Recuerda que cuando deserialices los datos, los «hobbies» serán una lista, no un conjunto.

La línea data["hobbies"] = list(data["hobbies"]) está convirtiendo el valor asociado a la clave «hobbies» de un conjunto (set) a una lista.

Inicialmente, data["hobbies"] es un conjunto:

python
{"fútbol", "cine", "música"}

La función list() toma un iterable (como un conjunto) y crea una nueva lista que contiene los mismos elementos. Entonces list(data["hobbies"]) crea una lista:

python
["fútbol", "cine", "música"]

Luego, esta nueva lista se asigna de vuelta a la clave «hobbies» en el diccionario data. Así que después de esta línea de código, data["hobbies"] es una lista, no un conjunto.

El contenido del diccionario data después de esa línea de código sería algo como esto:

python
{
"nombre": "Juan",
"edad": 30,
"hobbies": ["fútbol", "cine", "música"] # Esto es ahora una lista
}

Y cuando se convierte a una cadena JSON utilizando json.dumps(data), obtienes:

json
{
"nombre": "Juan",
"edad": 30,
"hobbies": ["fútbol", "cine", "música"]
}

De esta manera, has convertido el conjunto en una lista, que es un tipo de dato que JSON puede manejar.

como puedo identificar que tipo de objeto o dato es un parametro que me llega a la funcion?

En Python, puedes usar la función incorporada type() para identificar el tipo de un objeto. Aquí tienes un ejemplo:

python
def identificar_tipo(obj):
return type(obj)

print(identificar_tipo(5)) # <class 'int'>
print(identificar_tipo('hola')) # <class 'str'>
print(identificar_tipo([1, 2, 3])) # <class 'list'>
print(identificar_tipo({'nombre': 'Juan'})) # <class 'dict'>

La función type() devuelve el tipo del objeto que se le pasa como argumento.

Además, Python también proporciona la función isinstance() que puedes usar para comprobar si un objeto es de un tipo determinado:

python
def es_lista(obj):
return isinstance(obj, list)

print(es_lista(5)) # False
print(es_lista('hola')) # False
print(es_lista([1, 2, 3])) # True

En este caso, isinstance(obj, list) comprueba si obj es una lista y devuelve True si lo es y False en caso contrario.