2
votes

Filtrer les données JSON par rapport au schéma JSON en Python

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 commentaires

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.


3 Réponses :


0
votes

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


1 commentaires

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.



1
votes

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.


0 commentaires

0
votes

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.


0 commentaires