Development/Python3..x

[python3] "TypeError: Object of type date is not JSON serializable" Error 발생시

louky 2021. 12. 6. 12:08
반응형

아직 필자는 파린이(파이썬 초보)이기에 또 끄적 거린다.

json dump 모듈 사용시 아래와 같은 error 발생시에 따른 조치(?)방법이다. 

 

TypeError: Object of type date is not JSON serializable
[ user_name@hostname:icon_backup ] $ ./json_test.py
Traceback (most recent call last):
  File "./json_test.py", line 8, in <module>
    json_data = json.dumps(data)
  File "/Users/User/.pyenv/versions/3.7.10/lib/python3.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/Users/User/.pyenv/versions/3.7.10/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/Users/User/.pyenv/versions/3.7.10/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/Users/User/.pyenv/versions/3.7.10/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type date is not JSON serializable

 

자세히는 설명이 어렵지만 해당 문제가 발생하는 원인은 필자의 경우  소스내에 date함수를 사용해서 발생하는 문제이다. 

소스 뿐만 아니라 json data내에 날짜 변수로 된 data가 있을 경우에도 동일하게 발생된다. 

 

예시)

<필자 test 소스>

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import datetime, json

today = datetime.date.today()
data = { 'date': today}
json_data = json.dumps(data)  ### 여기서 TypeError 발생 되며 today라는 변수 때문임

print(json_data)

<jsondata> : s3 bucket list 중 일부  

{
  "bucket" : [
      {'Name': 'test_s3', 'CreationDate': datetime.datetime(2020, 6, 10, 2, 12, 53, tzinfo=tzutc())},
      {'Name': 'test_s3_1', 'CreationDate': datetime.datetime(2021, 3, 26, 7, 5, 13, tzinfo=tzutc())}
    ]
}

 

 

반응형

 

 

위와 같은 소스 및 데이터 일 경우 Error 가 발생한다.

 

조치 방법은 아래와 같다.

json.dumps(s3_data, default=str, indent=2)

json.dumps안에  default함수를 추가해 ("default=str") 주면 된다. 

 

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import datetime, json
from dateutil.tz import tzutc

today = datetime.date.today()
data = { 'date': today }
json_data = json.dumps(data, default=str, indent=2)

print(json_data)

결과

 

다른 블로그에는 "default=json_default"를 추가하라고 되어 있는데 "str" 대신 "json_default"를 사용할 경우 아래와 같은 오류가 발생한다. python version문제인거 같은데 아직 파린이인 필자는 잘은 모르겠다. 

"NameError: name 'json_default' is not defined"

NameError: name 'json_default' is not defined

 

잘못된 부분이 있을 경우 댓글 달아 주시면 감사합니다.  

 

반응형