Jar*_*zel 50 python serialization json flask
我有一个需要jsonify的对象列表.我看过烧瓶jsonify文档,但我只是没有得到它.
我班有几个研究所,增值经销商,每一个都是一个字符串:gene_id
,gene_symbol
,p_value
.我需要做什么才能将其序列化为JSON?
我天真的代码:
jsonify(eqtls = my_list_of_eqtls)
Run Code Online (Sandbox Code Playgroud)
结果是:
TypeError: <__main__.EqtlByGene object at 0x1073ff790> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
据推测,我必须告诉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)
Run Code Online (Sandbox Code Playgroud)
当我通过curl调用它时,我得到:
{
"eqtls_by_gene": [
{
"gene_id": 1,
"gene_symbol": "EGFR",
"p_value": 0.1
},
{
"gene_id": 2,
"gene_symbol": "PTEN",
"p_value": 0.2
}
]
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 73
给你EqltByGene
一个额外的方法来返回一个字典:
class EqltByGene(object):
#
def serialize(self):
return {
'gene_id': self.gene_id,
'gene_symbol': self.gene_symbol,
'p_value': self.p_value,
}
Run Code Online (Sandbox Code Playgroud)
然后使用列表推导将对象列表转换为可序列化值列表:
jsonify(eqtls=[e.serialize() for e in my_list_of_eqtls])
Run Code Online (Sandbox Code Playgroud)
另一种方法是为函数编写一个钩子函数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)
Run Code Online (Sandbox Code Playgroud)
并将其分配给app.json_encoder
属性:
app = Flask(__name__)
app.json_encoder = MyJSONEncoder
Run Code Online (Sandbox Code Playgroud)
并直接将您的列表传递给jsonify()
:
return jsonify(my_list_of_eqtls)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
50596 次 |
最近记录: |