Flask jsonify对象列表

我有一个需要jsonify的对象列表。我看了烧瓶jsonify文档,但我只是不明白。

我班有几个研究所,增值经销商,每一个都是一个字符串:gene_id,gene_symbol,p_value。我需要怎么做才能将此序列化为JSON?

我的天真代码:

jsonify(eqtls = my_list_of_eqtls)

结果是:

TypeError: <__main__.EqtlByGene object at 0x1073ff790> is not JSON serializable

大概我必须告诉jsonify如何序列化EqtlByGene,但是我找不到一个显示如何序列化类实例的示例。

这段代码现在可以工作了(非常感谢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)

当我通过curl调用它时,我得到:

{

"eqtls_by_gene": [

{

"gene_id": 1,

"gene_symbol": "EGFR",

"p_value": 0.1

},

{

"gene_id": 2,

"gene_symbol": "PTEN",

"p_value": 0.2

}

]

}

回答:

给你EqltByGene一个额外的方法来返回字典:

class EqltByGene(object):

#

def serialize(self):

return {

'gene_id': self.gene_id,

'gene_symbol': self.gene_symbol,

'p_value': self.p_value,

}

然后使用列表推导将你的对象列表转换为可序列化值的列表:

jsonify(eqtls=[e.serialize() for e in my_list_of_eqtls])

另一种方法是为该json.dumps()函数编写一个钩子函数,但是由于你的结构很简单,因此列表理解和自定义方法更简单。

你也可以冒险和继承类别flask.json.JSONEncoder; 给它一个default()EqltByGene()实例转换为可序列化值的方法:

from flask.json import JSONEncoder

class MyJSONEncoder(JSONEncoder):

def default(self, obj):

if isinstance(obj, EqltByGene):

return {

'gene_id': obj.gene_id,

'gene_symbol': obj.gene_symbol,

'p_value': obj.p_value,

}

return super(MyJSONEncoder, self).default(obj)

并将其分配给app.json_encoder属性:

app = Flask(__name__)

app.json_encoder = MyJSONEncoder

并将你的列表直接传递给jsonify():

return jsonify(my_list_of_eqtls)

以上是 Flask jsonify对象列表 的全部内容, 来源链接: utcz.com/qa/433961.html

回到顶部