programing

플라스크 jsonify 객체 목록

telecom 2023. 2. 24. 13:15
반응형

플라스크 jsonify 객체 목록

jsonify해야 할 객체 목록이 있습니다.플라스크를 검사해 봤는데 이해가 안 가네요

클래스에는 여러 개의 inst-var가 있으며 각각 문자열입니다.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클래스의 인스턴스를 시리얼화하는 예를 찾을 수 없습니다.

아래에 나와 있는 몇 가지 제안을 따라 나만의 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)

컬을 통해 도달하려고 하면 다음과 같은 메시지가 나타납니다.

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()그러나 구조가 비교적 단순하기 때문에 목록 이해 및 사용자 지정 방법 접근법이 더 단순합니다.

당신은 또한 정말 모험적이고 서브클래스가 될 수 있다; 그것을 줄 수 있다.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)

이것을 Atribute에 할당합니다.

app = Flask(__name__)
app.json_encoder = MyJSONEncoder

직접 명단을 제출해 주세요.jsonify():

return jsonify(my_list_of_eqtls)

또한 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 데이터를 검증할 수 있으며 (적절한 추가 방법을 사용하여)EqltByGene인스턴스를 다시 표시합니다.

모듈의 문서를 보면 서브클래스로 메서드를 덮어쓰고 타입에 대한 지원을 추가할 수 있다고 나와 있습니다.개체를 포함할 수 있는 여러 개의 다른 구조를 직렬화할 경우 이 방법이 가장 일반적인 방법입니다.

사용하고 싶은 경우jsonify(예를 들어 Martijn이 제안하는 것처럼 클래스에 자신만의 메서드를 정의함으로써) 오브젝트를 간단한 타입으로 변환하는 것이 아마 더 쉬울 것입니다.

언급URL : https://stackoverflow.com/questions/21411497/flask-jsonify-a-list-of-objects

반응형