329 votes

Comment analyser les données au format JSON ?

Mon projet reçoit actuellement un message JSON en python dont je dois extraire des informations. Pour les besoins de cet article, nous allons le définir comme 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 en utilisant une liste et ensuite json.dumps mais pour faire l'inverse, je pense que je dois utiliser json.loads . Cependant, je n'ai pas eu beaucoup de chance avec cette méthode. Quelqu'un pourrait-il me fournir un extrait qui retournerait "2" avec l'entrée de "two" dans l'exemple ci-dessus ?

570voto

John Giotta Points 5606

Très simple :

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

96voto

jisaacstone Points 1648

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, et non json.loads :

j_obj = json.load(j)

(on l'oublie facilement : le 's' est pour 'string')

63voto

Pour une URL ou un fichier, utilisez json.load() . Pour les chaînes 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']

31voto

Venkat Points 347

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 pour le 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 ainsi (par exemple, en utilisant print json.dumps(data , indent=4)) :

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

1voto

Adam Wagner Points 7232

loads devrait fonctionner pour vous :

loads('{"one" : "1", "two" : "2", "three" : "3"}')['two']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X