Pregunta

My Python Code Consigues un mongodb y se recupera una matriz de los siguientes objetos:

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

Lo que quiero lograr, es devolver el siguiente JSON:

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

Sin embargo, cuando hago:

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

Obtengo: { 'mycollectionkey' : "*giant string representation of data*" } donde dicha cadena gigante, claramente ya no es JSON.

¿Fue útil?

Solución

El problema aquí es que ya está curvado la respuesta como JSON antes de pasar a la otra estructura de datos (ahora como una cadena) para devolverlo como JSON.Así que básicamente está haciendo una doble codificación y la "cadena" se codifica.

Así que solo pasa en los datos una vez:

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

así en una pequeña colección como esta:

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

Tienes un resultado como este:

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

Si está realmente preocupado por el orden de esas dos teclas, puede usar los "vertederos" de BSON para ir a una cadena y luego decodificar con el decodificador JSON estándar para obtener un dict nativo con los objetos Mongo deserializados, entoncesPoner más en su DICTO PEDIDO.

Pero realmente su cliente no debe preocuparse por el orden de las claves y simplemente esperar esos elementos de la raíz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top