Solo voy a agregar un ejemplo simple a lo que todos han explicado,
json.load ()
json.loadpuede deserializar un archivo en sí mismo, 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))
dará salida,
{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 daría este error:
TypeError: cadena esperada o buffer
json.loads ()
json.loads() deserializar cadena.
Entonces, para usarlo json.loads, tendré que pasar el contenido del archivo usandoread() función, por ejemplo,
utilizando content.read()con el json.loads()contenido de retorno del archivo,
with open("json_data.json", "r") as content:
print(json.loads(content.read()))
Salida,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Eso es porque tipo de content.read() es una cadena, es decir<type 'str'>
Si 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 'read'
Entonces, ahora sabes el json.loadarchivo deserialze yjson.loads deserializar una cadena.
Otro ejemplo,
sys.stdindevolver fileobjeto, 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 en su print(json.loads(sys.stdin.read()))lugar.
json.loads(s, *)- Deserializes(astr,bytesobytearrayejemplo que contiene un documento JSON) - docs.python.org/3.6/library/json.html