web-dev-qa-db-fra.com

Quelle est la différence entre les fonctions json.load () et json.loads ()

En Python, quelle est la différence entre json.load() et json.loads()?

Je suppose que la fonction load () doit être utilisée avec un objet fichier (je dois donc utiliser un gestionnaire de contexte) tandis que la fonction La fonction load () prend le chemin d'accès au fichier sous forme de chaîne. C'est un peu déroutant.

La lettre "s" dans json.loads() représente-t-elle chaîne?

Merci beaucoup pour vos réponses!

112
MMF

Oui, s représente une chaîne. La fonction json.loads ne prend pas le chemin du fichier, mais le contenu du fichier sous forme de chaîne. Regardez la documentation sur https://docs.python.org/2/library/json.html !

110
Gijs

La documentation est assez claire: 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]]]]]]]])

Désérialisez fp (un objet .read () - prenant en charge un fichier de type JSON) en un objet Python à l'aide de cette table de conversion.

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Désérialisez s (une instance str ou unicode contenant un document JSON) en un objet Python à l'aide de cette table de conversion.

Donc, load est pour un fichier, loads pour un string

28
RvdK

Je vais juste ajouter un exemple simple à ce que tout le monde a expliqué,

json.load ()

json.load peut désérialiser un fichier lui-même, c'est-à-dire qu'il accepte l'objet file,

with open("json_data.json", "r") as content:
  print(json.load(content))

va sortir,

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

Si j'ouvre un fichier et utilise json.loads à la place,

with open("json_data.json", "r") as content:
  print(json.loads(content))

Je voudrais obtenir cette erreur:

TypeError: chaîne ou tampon attendu

json.loads ()

json.loads() désérailise la chaîne.

utiliser content.read() avec json.loads() renvoie le contenu du fichier,

with open("json_data.json", "r") as content:
  print(json.loads(content.read()))

Sortie,

{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, c'est-à-dire <type 'str'>

Si j'utilise json.load() avec content.read() j'obtiens 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, vous connaissez maintenant json.load fichier de désérialisation et json.loads désérialiser une chaîne.

n autre exemple

sys.stdin return file object, donc si je 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 ferais plutôt print(json.loads(sys.stdin.read())).

20
Sufiyan Ghori