La sérialisation de MongoDB find() retourne dans un tableau JSON non anonyme, à l'aide de PyMongo

StackOverflow https://stackoverflow.com//questions/23024356

Question

Mon code Python interroge un MongoDB et récupère un tableau des objets suivants :

{
    u'attribute': u'value',
    u'_id': ObjectId('534776c66e5987041f6154bd')
}

Ce que je veux réaliser, c'est renvoyer le JSON suivant :

{
    'mycollectionkey' : [
        {
            'attribute':'value',
            '_id': ObjectId('534776c66e5987041f6154bd')
        },
        ...and so on.
     ]
}

Par contre, quand je fais :

docs = mongodb.find(...query...)
docs_json = bson.json_util.dumps(docs)
return flask.jsonify(success=True,mycollectionkey=docs_json)

Je reçois: { 'mycollectionkey' : "*giant string representation of data*" } où ladite chaîne géante n’est clairement plus du JSON.

Était-ce utile?

La solution

Le problème ici est que vous avez déjà chaîne la réponse en JSON avant de la transmettre dans une autre structure de données (maintenant sous forme de chaîne) afin de la renvoyer en JSON.Donc, vous faites essentiellement un double encodage et la "chaîne" est codée.

Il suffit donc de transmettre les données une fois :

docs = mongodb.find(...query...)
return bson.json_util.dumps({ 'success': True, 'mycollectionKey': docs })

Donc sur une petite collection comme celle-ci :

{ "_id" : ObjectId("5343aeb5efbdb94c3647c8df"), "field" : "BBB" }
{ "_id" : ObjectId("5343aebbefbdb94c3647c8e0"), "field" : "aaa" }
{ "_id" : ObjectId("5343aebfefbdb94c3647c8e1"), "field" : "AAA" }

Vous obtenez un résultat comme celui-ci :

{   
    "mycollectionKey": [
        {"field": "BBB", "_id": {"$oid": "5343aeb5efbdb94c3647c8df"}}, 
        {"field": "aaa", "_id": {"$oid": "5343aebbefbdb94c3647c8e0"}}, 
        {"field": "AAA", "_id": {"$oid": "5343aebfefbdb94c3647c8e1"}}
    ], 
    "success": true
}

Si vous êtes vraiment inquiet de l'ordre de ces deux clés, vous pouvez utiliser les "dumps" bson pour accéder à une chaîne puis la décoder avec le décodeur json standard afin d'obtenir un dict natif avec les objets Mongo désérialisés, puis le mettre davantage dans votre dict ordonné.

Mais en réalité, votre client ne devrait pas se soucier de l’ordre des clés et s’attendre simplement à ces éléments racine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top