Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Djongo JSON Serializable Error #24

Open
Zih0 opened this issue Aug 13, 2021 · 2 comments
Open

Djongo JSON Serializable Error #24

Zih0 opened this issue Aug 13, 2021 · 2 comments
Labels
documentation📂 Improvements or additions to documentation

Comments

@Zih0
Copy link
Contributor

Zih0 commented Aug 13, 2021

Model.objects.get 또는 filter를 사용해서 데이터를 불러올 경우,
Response 안에 ObjectID가 아래와 같이 반환되는 경우가 있습니다.

{
  "_id": {
    "$oid": "abc123"
  }
}

아래와 같은 형태로 바꿔주기 위해 utils에 JSONEncoder class를 만들었습니다.

{
  "_id":  "abc123"
}
class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)
        return json.JSONEncoder.default(self, o)

사용방법은 아래와 같이 작성하면 됩니다.

json.loads(json.dumps(user_review_data, cls=JSONEncoder))

bson.json_util 의 dumps와 loads를 사용해왔는데, JSONEncoder를 커스텀해서 사용하기 위해선 json의 dumps를 사용해야했습니다.

위 문제를 다른 방법으로 해결했다면 알려주세요.

@Zih0 Zih0 added the documentation📂 Improvements or additions to documentation label Aug 13, 2021
@Zih0
Copy link
Contributor Author

Zih0 commented Aug 13, 2021

util 추가

util로 해당 과정도 함수로 만들어놨습니다.
적재적소에 사용하면 될 것 같습니다.

# server.utils.json_util.py
def jsonify(data):
    return json.loads(json.dumps(data, cls=JSONEncoder))

#views.py

from server.utils.json_util import jsonify

response_object = {
            "success": True,
            "message": f"{user_review_len}개의 리뷰를 불러왔습니다.",
            "data": jsonify(user_review_data),
        }

@Zih0 Zih0 assigned Zih0 and unassigned Zih0 Aug 13, 2021
@Zih0 Zih0 changed the title ObjectID Return 문제 해결 Djongo JSON Serializable Error Aug 19, 2021
@Zih0
Copy link
Contributor Author

Zih0 commented Aug 19, 2021

class JSONEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o, ObjectId):
            return str(o)

        if isinstance(o, (datetime.datetime, datetime.date, datetime.time)):
            return o.isoformat()

        return json.JSONEncoder.default(self, o)

datetime format도 처리해줬습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation📂 Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant