플라스크 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
'programing' 카테고리의 다른 글
process.env 때문에 경고를 오류로 간주하고 있습니다.CI = 참입니다.컴파일 실패 (0) | 2023.02.24 |
---|---|
WordPress 텍스트 편집기를 사용하여 html처럼 행동하는 방법 (0) | 2023.02.24 |
요소가 존재하는지 여부에 대한 조건을 영사기에 작성하는 방법 (0) | 2023.02.24 |
를 부호화하는 표준 방법이 있습니까?MS Ajax에서 사용하기 위해 JavaScript 문자열에 NET 문자열을 입력하시겠습니까? (0) | 2023.02.24 |
TypeScript의 Angular Framework 오류 - "exportAs가 ngForm으로 설정된 지시문이 없습니다." (0) | 2023.02.24 |