Je vais juste ajouter un exemple simple à ce que tout le monde a expliqué,
json.load ()
json.loadpeut désérialiser un fichier lui-même c'est-à-dire qu'il accepte un fileobjet, par exemple,
# 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))
sortira,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Si j'utilise json.loadspour ouvrir un fichier à la place,
# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
print(json.loads(content))
J'obtiendrais cette erreur:
TypeError: chaîne ou tampon attendu
json.loads ()
json.loads() désérialiser la chaîne.
Donc, pour utiliser, json.loadsje devrai transmettre le contenu du fichier en utilisant la read()fonction, par exemple,
utilisation content.read()avec le json.loads()contenu de retour du fichier,
with open("json_data.json", "r") as content:
print(json.loads(content.read()))
Production,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
C'est parce que le type de content.read()est une chaîne, ie<type 'str'>
Si j'utilise json.load()avec content.read(), j'obtiendrai une erreur,
with open("json_data.json", "r") as content:
print(json.load(content.read()))
Donne,
AttributeError: l'objet 'str' n'a pas d'attribut 'read'
Donc, maintenant vous savez json.loaddésérialiser le fichier et json.loadsdésérialiser une chaîne.
Un autre exemple,
sys.stdinreturn fileobject, donc si je le fais print(json.load(sys.stdin)), j'obtiendrai les données json réelles,
cat json_data.json | ./test.py
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Si je veux utiliser json.loads(), je le ferais à la print(json.loads(sys.stdin.read()))place.
json.loads(s, *)- Deserializes(unstr,bytesou parbytearrayexemple contenant un document JSON) - docs.python.org/3.6/library/json.html