¿Cuál es la diferencia entre las funciones json.load() y json.loads()?

Resuelto MMF asked hace 8 años • 6 respuestas

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 ?

MMF avatar Sep 27 '16 15:09 MMF
Aceptado

Sí, ssignifica cuerda. La json.loadsfunció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) 
Gijs avatar Sep 27 '2016 08:09 Gijs

Solo voy a agregar un ejemplo simple a lo que todos han explicado.

json.cargar()

json.loadpuede deserializar un archivo, es decir, acepta un fileobjeto, 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.loadspara 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.loadstendré 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.loaddeserializar un archivo y json.loadsdeserializar una cadena.

Otro ejemplo,

sys.stdinobjeto 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.

Sufiyan Ghori avatar Oct 17 '2018 00:10 Sufiyan Ghori

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 loadocurre con un archivo, loadscon unstring

RvdK avatar Sep 27 '2016 08:09 RvdK

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'
Wlad avatar Oct 27 '2019 09:10 Wlad