gpt4 book ai didi

python - Flask jsonify 对象列表

转载 作者:IT老高 更新时间:2023-10-28 12:46:02 25 4
gpt4 key购买 nike

我有一个需要 jsonify 的对象列表。我查看了 flask jsonify 文档,但我就是不明白。

我的类(class)有几个 inst-var,每个都是一个字符串:gene_idgene_symbolp_value。我需要做什么才能将其序列化为 JSON?

我的幼稚代码:

jsonify(eqtls = my_list_of_eqtls)

结果:

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

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

我一直在尝试按照下面显示的一些建议来创建我自己的 JSONEncoder 子类。我的代码现在是:

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 访问它时,我得到:

TypeError(repr(o) + " is not JSON serializable")

最佳答案

给你的 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() 函数编写一个钩子(Hook)函数,但由于您的结构相当简单,因此列表推导和自定义方法方法更简单。

你也可以是真正的冒险家和子类 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 attribute :

app = Flask(__name__)
app.json_encoder = MyJSONEncoder

只需将您的列表直接传递给 jsonify():

return jsonify(my_list_of_eqtls)

您还可以查看 Marshmallow project用于将对象序列化和反序列化为易于适应 JSON 和其他此类格式的 Python 原语的更成熟和灵活的项目;例如:

from marshmallow import Schema, fields

class EqltByGeneSchema(Schema):
gene_id = fields.Integer()
gene_symbol = fields.String()
p_value = fields.Float()

然后使用

jsonify(eqlts=EqltByGeneSchema().dump(my_list_of_eqtls, many=True)

生成 JSON 输出。相同的模式可用于验证传入的 JSON 数据和(使用 appropriate extra methods ),用于再次生成 EqltByGene 实例。

关于python - Flask jsonify 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21411497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com