¿Cuál es la diferencia entre las funciones json.load() y json.loads()?
En Python, ¿cuál es la diferencia entre json.load()
y json.loads()
?
Supongo que la función load() debe usarse con un objeto de archivo (por lo tanto, necesito usar un administrador de contexto) mientras que la función loads() toma la ruta al archivo como una cadena. Es un poco confuso.
¿La letra " s " json.loads()
significa cadena ?
Sí, s
significa cuerda. La json.loads
función no toma la ruta del archivo, sino el contenido del archivo como una cadena. Mira la documentación .
Ejemplo sencillo:
with open("file.json") as f:
data = json.load(f) # ok
data = json.loads(f) # not ok, f is not a string but a file
text = '{"a": 1, "b": 2}' # a string with json encoded data
data = json.loads(text)
Solo voy a agregar un ejemplo simple a lo que todos han explicado.
json.cargar()
json.load
puede deserializar un archivo, es decir, acepta un file
objeto, por ejemplo,
# open a json file for reading and print content using json.load
with open("/xyz/json_data.json", "r") as content:
print(json.load(content))
saldrá,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Si uso json.loads
para abrir un archivo en su lugar,
# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
print(json.loads(content))
Me saldría este error:
TypeError: cadena o búfer esperado
json.cargas()
json.loads()
deserializar cadena.
Entonces, para usarlo json.loads
tendré que pasar el contenido del archivo usando read()
la función, por ejemplo,
usando content.read()
con json.loads()
contenido de retorno del archivo,
with open("json_data.json", "r") as content:
print(json.loads(content.read()))
Producción,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Eso es porque el tipo de content.read()
es cadena, es decir<type 'str'>
Si lo uso json.load()
con content.read()
, obtendré un error.
with open("json_data.json", "r") as content:
print(json.load(content.read()))
Da,
AttributeError: el objeto 'str' no tiene el atributo 'leer'
Ahora ya sabes json.load
deserializar un archivo y json.loads
deserializar una cadena.
Otro ejemplo,
sys.stdin
objeto de retorno file
, así que si lo hago print(json.load(sys.stdin))
, obtendré datos json reales,
cat json_data.json | ./test.py
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Si quiero usar json.loads()
, lo haría print(json.loads(sys.stdin.read()))
en su lugar.
La documentación es bastante clara: https://docs.python.org/2/library/json.html
json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
Deserialice fp (un objeto similar a un archivo que admite .read() y que contiene un documento JSON) a un objeto Python usando esta tabla de conversión.
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
Deserialice s (una instancia str o Unicode que contiene un documento JSON) a un objeto Python usando esta tabla de conversión.
Lo mismo load
ocurre con un archivo, loads
con unstring
RESPUESTA RÁPIDA (¡muy simplificada!)
json.load() toma un ARCHIVO
json.load() espera un archivo (objeto de archivo), por ejemplo, un archivo que abrió antes indicado por una ruta de archivo como
'files/example.json'
.
json.loads() toma una CADENA
json.loads() espera una cadena JSON (válida), es decir
{"foo": "bar"}
EJEMPLOS
Suponiendo que tiene un archivo example.json con este contenido: { "key_1": 1, "key_2": "foo", "Key_3": null }
>>> import json
>>> file = open("example.json")
>>> type(file)
<class '_io.TextIOWrapper'>
>>> file
<_io.TextIOWrapper name='example.json' mode='r' encoding='UTF-8'>
>>> json.load(file)
{'key_1': 1, 'key_2': 'foo', 'Key_3': None}
>>> json.loads(file)
Traceback (most recent call last):
File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 341, in loads
TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper
>>> string = '{"foo": "bar"}'
>>> type(string)
<class 'str'>
>>> string
'{"foo": "bar"}'
>>> json.loads(string)
{'foo': 'bar'}
>>> json.load(string)
Traceback (most recent call last):
File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 293, in load
return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'