Domanda

Il mio codice Python interroga un mongodb e torna indietro un array dei seguenti oggetti:

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

Quello che voglio raggiungere, è quello di restituire il seguente JSON:

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

Tuttavia, quando faccio:

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

Io ottengo: { 'mycollectionkey' : "*giant string representation of data*" } dove detta stringa gigante, chiaramente non è più JSON.

È stato utile?

Soluzione

Il problema qui è che hai già pensato la risposta come JSON prima di passarlo in un'altra struttura dati (ora come una stringa) per restituirlo come JSON.Quindi stai fondamentalmente facendo una doppia codifica e la "stringa" viene codificata.

Quindi passa semplicemente nei dati una volta:

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

Quindi su una piccola collezione come questa:

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

yo prendi un risultato come questo:

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

Se sei davvero preoccupato per l'ordine di quei due tasti, puoi usare i "Dumps" BSON per andare a una stringa e decodificare con il decodificatore JSON standard per ottenere un dettone nativo con gli oggetti del MONGO deserializzati, quindiulteriormente inserito nel tuo detto ordinato.

Ma davvero il tuo cliente non dovrebbe interessarti l'ordine dei tasti e aspettarsi solo quegli elementi radice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top