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?

ingh.am
la source
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']
John Giotta
la source
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')

jisaacstone
la source
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']
Mohammad Shahid Siddiqui
la source
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"
}
Venkat
la source
-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
Biranchi
la source
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