Flask jsonify eine Liste von Objekten
Ich habe eine Liste von Objekten, die ich jsonifizieren muss. Ich habe mir die Flasche angesehen, aber ich verstehe sie einfach nicht.
Meine Klasse hat mehrere Inst-Variablen, von denen jede eine Zeichenfolge ist:gene_id
, gene_symbol
, p_value
. Was muss ich tun, um diese als JSON serialisierbar zu machen?
Mein naiver Code:
jsonify(eqtls = my_list_of_eqtls)
Ergebnisse in:
TypeError: <__main__.EqtlByGene object at 0x1073ff790> is not JSON serializable
Vermutlich muss ich jsonify sagen, wie man einen serialisiertEqtlByGene
Ich kann jedoch kein Beispiel finden, das zeigt, wie eine Instanz einer Klasse serialisiert wird.
Dieser Code funktioniert jetzt (mit vielen Dank an Martijn Pieters!):
class EqtlByGene(Resource):
def __init__(self, gene_id, gene_symbol, p_value):
self.gene_id = gene_id
self.gene_symbol = gene_symbol
self.p_value = p_value
class EqtlJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, EqtlByGene):
return {
'gene_id' : obj.gene_id,
'gene_symbol' : obj.gene_symbol,
'p_value' : obj.p_value
}
return super(EqtlJSONEncoder, self).default(obj)
class EqtlByGeneList(Resource):
def get(self):
eqtl1 = EqtlByGene(1, 'EGFR', 0.1)
eqtl2 = EqtlByGene(2, 'PTEN', 0.2)
eqtls = [eqtl1, eqtl2]
return jsonify(eqtls_by_gene = eqtls)
api.add_resource(EqtlByGeneList, '/eqtl/eqtlsbygene')
app.json_encoder = EqtlJSONEncoder
if __name__ == '__main__':
app.run(debug=True)
Wenn ich es per Curl rufe, bekomme ich:
{
"eqtls_by_gene": [
{
"gene_id": 1,
"gene_symbol": "EGFR",
"p_value": 0.1
},
{
"gene_id": 2,
"gene_symbol": "PTEN",
"p_value": 0.2
}
]
}