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

bson.errors.InvalidDocument :la clé '$numberDecimal' ne doit pas commencer par '$' lors de l'utilisation de json

Encore un lancer de dés de ma part. Si vous utilisez la validation de schéma comme vous le faites, je vous recommande de définir une classe et d'être explicite en définissant chaque champ et comment vous proposez de convertir le champ en types de données python pertinents. Bien que votre solution soit générique, la structure de données doit être rigide pour correspondre à la validation.

IMO, c'est plus clair et vous avez le contrôle sur les erreurs, etc. au sein de la classe.

Juste pour confirmer que j'ai exécuté la validation du schéma et que cela fonctionne avec la validation fournie.

from pymongo import MongoClient
import bson.json_util
import dateutil.parser
import json

class Film:
    def __init__(self, file):
        data = file.read()
        loaded = json.loads(data)
        self.IdTitulo  = loaded.get('IdTitulo')
        self.IdDirector = loaded.get('IdDirector')
        self.IdDecimal = bson.json_util.Decimal128(loaded.get('IdDecimal'))
        self.IdNumber = int(loaded.get('IdNumber'))
        self.IdDateTime = dateutil.parser.parse(loaded.get('IdDateTime'))

    def insert_one(self, collection):
        collection.insert_one(self.__dict__)

client = MongoClient()
mycollection = client.mydatabase.test_dec

with open('c:/temp/1.json', 'r') as jfile:
    film = Film(jfile)
    film.insert_one(mycollection)

donne :

> db.test_dec.findOne()
{
        "_id" : ObjectId("5eba79eabf951a15d32843ae"),
        "IdTitulo" : "Jaws",
        "IdDirector" : "Steven Spielberg",
        "IdDecimal" : NumberDecimal("2.33"),
        "IdNumber" : 8,
        "IdDateTime" : ISODate("2020-05-12T10:08:21Z")
}

>

Fichier JSON utilisé :

{
    "IdTitulo": "Jaws",
    "IdDirector": "Steven Spielberg",
    "IdNumber": 8,
    "IdDecimal": "2.33",
    "IdDateTime": "2020-05-12T11:08:21+0100"
}