J'ai un tas de données JSON provenant de publications Facebook comme celle ci-dessous:
{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}
Les données JSON sont semi-structurées et tout n'est pas pareil. Voici mon code:
import json
str = '{"from": {"id": "8", "name": "Mary Pinter"}, "message": "How ARE you?", "comments": {"count": 0}, "updated_time": "2012-05-01", "created_time": "2012-05-01", "to": {"data": [{"id": "1543", "name": "Honey Pinter"}]}, "type": "status", "id": "id_7"}'
data = json.loads(str)
post_id = data['id']
post_type = data['type']
print(post_id)
print(post_type)
created_time = data['created_time']
updated_time = data['updated_time']
print(created_time)
print(updated_time)
if data.get('application'):
app_id = data['application'].get('id', 0)
print(app_id)
else:
print('null')
#if data.get('to'):
#... This is the part I am not sure how to do
# Since it is in the form "to": {"data":[{"id":...}]}
Je veux que le code imprime le to_id en tant que 1543 sinon print 'null'
Je ne sais pas comment faire cela.
in
vérifications explicites etraise
si elles sont manquantes? Accédez-y simplement sans vérifier, et vous obtiendrez exactement le même comportement (sauf avec aKeyError
au lieu de aValueError
).Si tout ce que vous voulez, c'est vérifier si la clé existe ou non
Si vous souhaitez vérifier s'il existe une valeur pour la clé
Renvoie une valeur par défaut si la valeur réelle est manquante
la source
C'est une bonne pratique de créer des méthodes utilitaires d'aide pour des choses comme ça afin que chaque fois que vous avez besoin de changer la logique de validation d'attribut, elle se trouve au même endroit et le code sera plus lisible pour les abonnés.
Par exemple, créez une méthode d'assistance (ou une classe
JsonUtils
avec des méthodes statiques) dansjson_utils.py
:puis utilisez-le dans votre projet:
NOTE IMPORTANTE:
Il y a une raison pour laquelle j'utilise
data.get(attribute) or default_value
au lieu de simplementdata.get(attribute, default_value)
:Dans mes applications, obtenir un attribut avec la valeur «null» équivaut à ne pas obtenir l'attribut du tout. Si votre utilisation est différente, vous devez changer cela.
la source
Essayez-le:
Ou, si vous souhaitez simplement ignorer les valeurs manquantes d'ID au lieu d'imprimer
'null'
:Alors:
Bien sûr, dans la vraie vie, vous ne voulez probablement pas
print
chaque identifiant, mais les stocker et faire quelque chose avec eux, mais c'est un autre problème.la source
la source
J'ai écrit une petite fonction à cet effet. N'hésitez pas à réutiliser,
la source