10
votes

PARSING JSON avec Python: champs vides

J'ai des problèmes tout en analysant un JSON avec Python, et maintenant je suis coincé.
Le problème est que les entités de mon JSON ne sont pas toujours les mêmes. Le Json est quelque chose comme: xxx

Je peux passer à travers le JSON, par exemple: xxx

Le problème vient parce que parfois, le JSON N'a pas contenant tous les "champs", par exemple, le champ téléphone , est parfois manquant, donc, le script échoue avec keerror , car la touche téléphone < / em> manque dans cette entrée.
Donc, ma question: Comment puis-je exécuter ce script, laissant un espace vide où téléphone est manquant? J'ai essayé avec: xxx

mais je pense ne pas être ok.


0 commentaires

4 Réponses :


15
votes

Utilisez dict.get au lieu de [] : xxx

ou, simplement: xxx < / pré>

obtenez retournera le deuxième argument (par défaut, Aucun ) au lieu de soulever un KeyError lorsque la clé n'est pas trouvée.


0 commentaires

0
votes

Il existe plusieurs fonctionnalités de dictionnaire utiles que vous pouvez utiliser pour fonctionner avec ceci.

Tout d'abord, vous pouvez utiliser dans pour tester si une clé existe ou non dans un dictionnaire: xxx

obtenir pourrait également être utile; Il vous permet de spécifier une valeur par défaut si la clé est manquante: xxx

au-delà de cela, vous pouvez regarder dans le collections de la bibliothèque standard.defaultdict , Mais cela pourrait être surchargé.


0 commentaires

8
votes

Si les données sont manquantes dans un seul endroit, alors dict.get peut être utilisé pour remplir la valeur manquante de la valeur manquante: xxx

Si le problème est plus répandu, vous pouvez avoir l'analyseur JSON Utilisez un DefaultDict ou dictionnaire personnalisé au lieu d'un dictionnaire régulier. Par exemple, étant donné la chaîne JSON: xxx

analyse avec: xxx

comme une note latérale, si vous voulez Pour nettoyer vos ensembles de données et appliquer la cohérence, il existe un outil fine appelé Kwalify qui la validation du schéma sur JSON (et sur yaml);


2 commentaires

Nice, j'aime mieux ça alors defaultDict car à l'intérieur du __ manquant __ Méthode pourrait ajouter une logique pour attraper un bogue potentiel. Avec DefaultDict Je crains toujours parce que je ne vais pas obtenir de KeyError lorsque je fais une faute de frappe.


Entrées ['Extensions']. Obtenez ('Téléphone', {}). Obtenez ('autreMissingkey', {}) est presque 3x aussi rapide (sur Deb9's py3.5) comme objet_hook = APPROCHE DE VIDEDICT , et cela fonctionne pour plusieurs niveaux



0
votes

Deux manières.

One est de vous assurer que vos dictionnaires sont standard et que lorsque vous les lisez, ils ont tous les champs. L'autre doit être prudent lors de l'accès aux dictionnaires.

Voici un exemple de veille à vous assurer que vos dictionnaires sont standard: xxx

Voici un exemple de Être prudent lors de l'accès aux dictionnaires: xxx


0 commentaires