Comment analyser JSON en Python?


282

Mon projet reçoit actuellement un message JSON en python dont j'ai besoin pour obtenir des informations. Pour cela, définissons-le sur un simple JSON dans une chaîne:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

Jusqu'à présent, j'ai généré des requêtes JSON à l'aide d'une liste, puis json.dumps, mais pour faire le contraire, je pense que je dois utiliser json.loads. Mais je n'ai pas eu beaucoup de chance avec ça. Quelqu'un pourrait-il me fournir un extrait qui retournerait "2"avec l'entrée de "two"dans l'exemple ci-dessus?


8
Remarque : Pour ceux qui viennent ici avec des données qui utilisent 'des délimiteurs de chaîne entre guillemets simples, vous pouvez avoir créé par inadvertance des représentations de chaîne pour les dictionnaires Python. JSON utilisera toujours des "délimiteurs . Si oui, réparez votre code qui produit cette sortie à utiliser à la json.dumps()place de str()ou repr(), et dirigez-vous vers Convertir une représentation de chaîne d'un dictionnaire en dictionnaire? pour savoir comment récupérer vos données Python. D'autres indices que vous avez un littéral Python? Recherchez None, Trueou False, JSON utiliserait null, true& false.
Martijn Pieters

Ceux qui n'ont pas de jsonStr mais une liste de dictionnaires (éventuellement avec 'des délimiteurs de chaîne entre guillemets simples), ont également un coup d'oeil ici: stackoverflow.com/questions/41168558/…
Lorenz

Réponses:


493

Très simple:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

Jetez également un œil à simplejson si vous avez besoin de meilleures performances. Des versions plus récentes offrent des optimisations qui améliorent considérablement la lecture et l'écriture.
onode

2
Je suis en fait à l' aide déjà simplejson: import simplejson as json. Oublié de mentionner mais merci :)
ingh.am

Je l'ai. Utilisait la .loadméthode au lieu de.loads
Sunil Kumar

85

Parfois, votre json n'est pas une chaîne. Par exemple, si vous obtenez un json à partir d'une URL comme celle-ci:

j = urllib2.urlopen('http://site.com/data.json')

vous devrez utiliser json.load, pas json.loads:

j_obj = json.load(j)

(il est facile d'oublier: le 's' est pour 'string')


Juste pour ajouter que vous pouvez obtenir le contenu de la chaîne en appelant j.read () puis en utilisant la méthode charges. Quoi qu'il en soit, dans ce cas, la méthode load () prend soin d'appeler le .read ()
rkachach

51

Pour URL ou fichier, utilisez json.load(). Pour une chaîne avec un contenu .json, utilisez json.loads().

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

Voici un exemple simple qui peut vous aider:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

La sortie du code ci-dessus sera:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

Notez que vous pouvez définir l'argument ident de dump pour l'imprimer comme tel (par exemple, lorsque vous utilisez print json.dumps (data, indent = 4)):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

Peut utiliser des modules json ou ast python:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
Vous ne pouvez pas utiliser la ast.literal_eval()fonction pour JSON, parce qu'au - delà de vos exemples triviaux uniquement du texte et entier que vous allez rencontrer des problèmes. JSON n'est pas Python . Ce n'est pas parce que certains JSON peuvent être analysés que ast.literal_eval()cela constitue une approche appropriée.
Martijn Pieters

1
Par exemple, vous ne pouvez pas analyser à l' r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'aide ast.literal_eval(), car il contient des valeurs nulles, une valeur booléenne et un seul point de code non BMP. JSON représente ces valeurs différemment de la façon dont les littéraux Python les représenteraient. json.loads()d'autre part, n'a aucun problème avec cette entrée et correctement décode que pour {'foo': None, 'bar': True, 'baz': '🤦'}.
Martijn Pieters

1
Ensuite, ast.literal_eval()est un peu plus lent et ne peut pas être personnalisé. Vous ne devez jamais l'utiliser pour décoder le JSON .
Martijn Pieters
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.