JSON으로 응답을 보내기 위해서는 데이터를 직렬화해서 보내야합니다.
하지만 json에서 표현할 수 있는 데이터는 한정이 되어 있고 모든 타입을 표현하지는 못합니다. Decimal이나 DateTime이 그 중 하나입니다.
flask에서는 jsonify()를 이미 제공하고 있고 json을 내보낼때 결국 어떤 객체에서 데이터를 가져오게 됩니다.
객체 내 형을 변환하거나 추가적으로 같은 내용의 다른 형의 변수를 두는 것도 방법이 되지만
flask에서는 app.json_encoder를 제공하고 있어서 jsonify()를 통해서 응답을 보낼 경우, 지정한 인코더를 통해서 생성되도록 만들 수 있습니다.
from decimal import Decimal
def custom_json_encoder(app):
class CustomJsonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Decimal):
return str(obj)
if obj is None:
return str('')
return super(CustomJsonEncoder, self).default(obj)
app.json_encoder = CustomJsonEncoder
CustomJsonEncoder는 Decimal형을 문자열로 치환해서 보내주고 있고, None인 값에 대해서는 빈 문자열로 치환해서 보내주고 있습니다.
JsonEncoder를 활용하면, 타입에 따라서 json에서 표시할 때만 다르게 표시하는것이 가능합니다. 예를들면, datetime형의 경우 포맷(format)을 다르게 표현할 수 있는데 각 클래스에서 그것을 작업해주는게 아니라 일괄적으로 특정 포맷으로 변경해서 보낼 수도 있습니다.