-
[WEEK00/DAY02] flask jsonify - ObjectId 전달 에러SW Jungle/TIL (Today I Learned) 2022. 9. 21. 01:39
flask의 기능인 jsonify를 이용하여, javascript 쪽에 딕셔너리 형태의 데이터를 넘기려고 시도했다.
그러나 자꾸 다음과 같은 에러가 나는 바람에 한참 애먹었다.
TypeError: Object of type ObjectId is not JSON serializable
ObjectId가 JSON 형태로 시리얼라이즈 될 수 없다는 에러 메시지였다.
그렇다면 ObjectId는 무엇인가?
나는 데이터 관리를 위해 mongoDB를 사용했는데, ObjectId는 mongoDB에서 제공하는 unique한 형태의 id 값이었다.
mongoDB의 공식 문서를 참고해보면,
대충 해석해보면, 12바이트 길이를 가지고 있는데 다음과 같은 구성으로 이루어져 있다:
- 4바이트 길이의 타임스탬프 (ObjectId가 생성될때의 타임과 관련이 있다)
- 5바이트 길이의 랜덤 값 (사용자의 머신과 프로세스에 관련이 있다)
- 3바이트 길이의 incrementing counter (증가하는 카운터... 마땅한 해석이 어려운데 아무튼 랜덤 값에 의해 생성된다고 함)
그러니까 쉽게 말하면, 식별자로 사용해도 좋을만한 고유 ID 값인 것이다.
문제는 이 ObjectId 형식이 json 형태로 전달될 수 없다는 것이다.
TypeError: Object of type ObjectId is not JSON serializable
그럼 이 에러는 어떻게 해결하냐... 하면
아예 ObjectId를 제외하든지,
ObjectId를 꼭 써야 한다면 이 형식을 string 같은 JSON 전달 가능한 형태로 변환해주면 된다.
data = list(db.find({'info':True},{'_id':False})) return jsonify({'result' : 'success', 'data' : data})
이처럼 {'_id':False} 를 조건으로 넣어서 제외시켜주는 방법이 있고,
result = list(db.find({})) for i in result: i['_id'] = str(i['_id']) return jsonify({'result': 'success', 'articles': result})
이처럼 str()로 감싸주어 문자열로 변환해도 된다.
단, 이렇게 string으로 변환한 값을 다시 이용하여 ObjectId를 찾는데 쓰려면 다시 ObjectId()로 감싸주어서 형식 변환을 해주어야 한다.
from bson import ObjectId이렇게 import하면 ObjectId()를 사용할 수 있다.'SW Jungle > TIL (Today I Learned)' 카테고리의 다른 글
[WEEK01/DAY04] 백준 문제 : 수 정렬하기 3 (0) 2022.09.27 [WEEK01/DAY02] python : 배열의 복사본을 삭제했는데 원본이 삭제될 때 (0) 2022.09.25 [WEEK01/DAY01] 백준 문제 : 소수 찾기 (0) 2022.09.24 [WEEK00/DAY03] Jinja2 값을 Javascript에서 사용하기 (0) 2022.09.22 [WEEK00/DAY01] Jinja2, SSR(Server-Side Rendering) (1) 2022.09.20