IT/python

[python] json dump/dumps/load/loads 구분하기

심량 2020. 9. 7. 18:33

대충 이해하고 쓰다가 오랜만에 소스를 보니 헷갈립니다.

개인적으로 정리할 목적으로 글을 남깁니다.


  • json.dump
  • json.dumps
    • dump 계열은 파이썬의 객체(dict 등)를 다른 형태로 변환합니다.
      • dump 함수는 파이썬 객체를 스트림 객체(파일 등)로 변환합니다.
      • dumps 함수는 파이썬 객체를 한줄의(직렬화된) json 문자열로 변환합니다.
    • 오류
      • Expecting value: 
  • json.load
  • json.loads
    • load 계열은 대상을 파싱해서 파이썬의 객체(dict 등)로 변환합니다.
      • load 함수는 스트림 객체(파일 등)에서 데이터를 읽어 파이썬 객체(dict 등)로 변환해줍니다.
      • loads 함수는 json 문자열을 파싱해서 파이썬 객체로 변환해줍니다.
    • 오류
      • Expecting value: line 1 column 1 (char 0) 과 같은 오류가 발생한다면 인수로 들어온 자료형을 확인해보시기 바랍니다. 문자열(str)이 아닌 bytes 등의 자료형일 가능성이 있습니다. 둘 중 하나로 변환해서 되는 것을 사용하면 될 것 같습니다.
        • (char 0) 다음에 {} 라고 되어 있으면 원본이 아예 dict 자료형이 아닌 것입니다. dict 는 { 'a': 'b' } 형태이기 때문입니다.
      • the JSON object must be str, bytes or bytearray, not dict 변환 방향을 헷갈려서 dumps 를 써야 하는 dict 자료형을 인수로 사용한 경우입니다. 원본이 dict 가 맞다면 dumps 로 바꾸거나, dumps 를 써야하는게 맞다면 dict 가 아닌 json 문자열을 인수로 사용해야 합니다.
  • 검사방법
    • try/except 를 사용해서 무식하고 안전하게(?) 미리 해보면 알 수 있다!!! ㅋㅋ
    • dumps 할 수 있는가?
      • def IsJsonable(data):
            try:
                tempDumped = json.dumps(data)
                tempStripped = temp.strip("'<>() ").replace('\'''\"')
                json.loads(tempStripped)
                return True
            except:
                return False
    • loads 할 수 있는가?
      • def IsDictable(data):
            try:
                tempStripped = data.strip("'<>() ").replace('\'''\"')
                json.loads(data)
                return True
            except:
                return False
    • 참고로 "" 등으로 둘러쌓이면 dumps 나 loads 호출 시 오류가 발생하지 않을 수도 있습니다.