Je recherche un module Python pour filtrer les données JSON par rapport au schéma.
Par exemple, il y a des données JSON:
{ "system" : { "state" : "enabled", "id" : 5 } }
Et il y a un schéma JSON:
{ "system": { "id": "system", "required": true, "type": "object", "properties": { "state": { "id": "state", "required": true, "type": "string" }, "id": { "id": "id", "required": true, "type": "number" } } } }
Comme vous pouvez le voir, le schéma ne fonctionne pas contiennent la propriété "keys".
J'ai besoin d'un outil qui pourrait filtrer les données JSON en utilisant le schéma et fournir le JSON suivant comme sortie:
{ "system" : { "state" : "enabled", "id" : 5, "keys" : [ { "key_id": 12, "key": "filename.key" } ] } }
p >
3 Réponses :
Vous pouvez utiliser jsonschema
pour valider votre json par rapport au schéma, vérifiez cet exemple
from jsonschema import validate schema = {"type" : "object","properties" : { "price" : {"type" : "number"},"name" : {"type" : "string"},},} validate(instance={"name" : "Eggs", "price" : 34}, schema=schema)
Si aucune exception n'est levée par validate (), l'instance est valide
Merci, mais je demande comment filtrer les données JSON. Je m'attends à fournir un fichier JSON étendu et à en obtenir un plus petit en sortie. Quelque chose comme passer les données dans une passoire.
Le but du schéma JSON est de valider l'entrée JSON donnée par rapport à un schéma défini. Comme @Relequestual le dit dans un commentaire, vous ne pouvez pas utiliser le schéma JSON pour filtrer directement les champs.
Si vous devez supprimer uniquement le champ clés
, vous n'avez pas du tout besoin d'utiliser le schéma JSON. Vous pouvez simplement supprimer le champ de l'entrée JSON.
Si vous avez besoin de filtrer un tas de champs inattendus de l'entrée, vous pouvez utiliser le schéma JSON pour identifier
ces champs. Mais vous devez effectuer une partie de filtrage manuellement ou en utilisant une autre bibliothèque car le schéma JSON ne peut pas le faire pour vous.
Vous pouvez utiliser le champ additionalProperties
pour restreindre les clés inattendues.
{ "type":"object", "required":false, "properties":{ "system": { "id": "system", "required": true, "type": "object", "properties": { "state": { "id": "state", "required": true, "type": "string" }, "id": { "id": "id", "required": true, "type": "number" } }, "additionalProperties": false } } }
Cela donnera une erreur de validation comme suit p >
Message: La propriété 'clés' n'a pas été définie et le schéma n'autorise pas de propriétés supplémentaires. Chemin du schéma: # / properties / system / additionalProperties
Ce n'est peut-être pas la réponse exacte que vous recherchez. Mais j'espère que cela vous aidera.
Puisqu'il n'y a pas d'outil, pour filtrer les données JSON par rapport au schéma, j'ai résolu ma tâche comme suit.
Création du modèle du fichier JSON attendu. En fait, il s'agit déjà d'un fichier JSON filtré, mais sans données.
{ "system" : { "state" : "", "id" : 0 } }
Ensuite, parcourez le fichier de données et le fichier modèle et copiez simplement les valeurs de l'un à l'autre pour les propriétés qui existent dans les deux fichiers.
Le filtrage n'est pas une fonction du schéma JSON.
Je suppose que vous avez besoin d'un validateur de schéma json pour identifier ce qui doit être filtré. Je pense donc que vous pourriez demander à github.com/Julian/jsonschema pour voir s'il existe un moyen de utilisez ce package pour implémenter facilement le filtrage.
Je viens d'ajouter un problème github pour poser cette question, github.com/Julian/jsonschema/issues/707 . Si quelqu'un répond avec un moyen simple de le faire, je le posterai ici.