Python >> Tutoriel Python >  >> Python Tag >> JSON

Parser JSON en Python ?

Si vous souhaitez utiliser :

 $ cat members.json | \
     python -c 'import json,sys;obj=json.load(sys.stdin);print obj;'

vous pouvez inspecter la structure du dictionnaire imbriqué obj et voyez que votre ligne d'origine devrait être :

$ cat members.json | \
    python -c 'import json,sys;obj=json.load(sys.stdin);print obj["hits"]["hits"][0]["_source"]["'$1'"]';

à cet élément "memberId". De cette façon, vous pouvez conserver le Python en tant que oneliner.

S'il y a plusieurs éléments dans l'élément "hits" imbriqué, vous pouvez faire quelque chose comme :

$ cat members.json | \
python -c '
import json, sys
obj=json.load(sys.stdin)
for y in [x["_source"]["'$1'"] for x in obj["hits"]["hits"]]:
    print y
'

La solution de Chris Down est meilleure pour trouver une valeur unique aux clés (uniques) à n'importe quel niveau.

Avec mon deuxième exemple qui imprime plusieurs valeurs, vous atteignez les limites de ce que vous devriez essayer avec une seule ligne, à ce stade, je ne vois aucune raison de faire la moitié du traitement en bash et je passerais à une solution Python complète .


Une autre façon de le faire dans bash consiste à utiliser jshon. Voici une solution à votre problème en utilisant jshon :

$ jshon -e hits -e hits -a -e _source -e memberId -u < foo.json
0x7b93910446f91928e23e1043dfdf5bcf
0x7b93910446f91928e23e1043dfdf5bcG

Le -e les options extraient les valeurs du json. Le -a itère sur le tableau et le -u décode la chaîne finale.


Eh bien, votre clé n'est clairement pas à la racine de l'objet. Essayez quelque chose comme ceci :

json_key() {
    python -c '
import json
import sys

data = json.load(sys.stdin)

for key in sys.argv[1:]:
    try:
        data = data[key]
    except TypeError:  # This is a list index
        data = data[int(key)]

print(data)' "[email protected]"
}

Cela a l'avantage de ne pas simplement injecter de la syntaxe dans Python, ce qui pourrait provoquer des pannes (ou pire, l'exécution de code arbitraire).

Vous pouvez ensuite l'appeler comme ceci :

json_key hits hits 0 _source memberId < members.json

Prochain article
No