0. Introduction

  • asyncbs4 module을 사용하여 한 특정 웹 사이트를 스크랩핑하는 코드를 작성하고 있다.

  • 그 과정에서 Error가 발생하여 이에 대한 원인과 해결책을 기록두는 것뿐만 아니라, 모르는 것들에 대해 학습한 걸 기록한다.

  • 이번에는 ‘Serialization(직렬화)’ 란 개념과 Flat data, Nested data 무엇인지 알아보자. 마지막으로, json.loads()json.dumps()를 알아본다.

  • 이후 이 주제와 관련되어 새롭게 학습한 것이 있다면 이 포스팅에 정리한다.


1. Serialization(직렬화)

python docs-guide: Data Serializationstackoverflow - What is data serialization?에 따르면 data serialization의 정의를 다음과 같이 내린다.

‘Data serialization의(직렬화)‘란 구조화된 데이터를 저장되거나 공유될 수 있는 한 가지 형식으로 전환하는 것으로 즉, 저장되거나 네트워크를 통해 보내지기 위해서 다른 형식으로 객체를 인코딩하는 걸 말한다. 이 과정에서 데이터의 사이즈를 줄이는 효과도 가진다.

추가: 직렬화와 역직렬화 문서에 정리한 것처럼 직렬화json을 string으로 바꾸는 것 을 말하며, 역직렬화string을 json으로 바꾸는 것 을 의미한다.

직렬화의 전환되는 형식: 두 가지

Flat vs Nested data

전환되는 형식에는 두 가지 종류 가 있는데, 바로 Flat vs Nested data 다.

각 데이터 예시는 Flat vs. Nested Data Layer을 참고하자.

간단히 말하자면 이와 같다.

Flat은 계층화되어 있지 않은 데이터 종류로 one level의 properties나 “key: value” 쌍으로 구성된 데이터를 의미하고, nested는 계층화되어 있어 몇 개의 level로 구성된다.

각 데이터 타입에 대한 장단점도 위 링크에 있으니 참고하자.

Flat data

파이썬은 data에 flat data가 포함되어 있다면 직렬화하기 위해 repr method나 csv module을 제공한다.

Nested data

Nested data의 종류에는 YAML, JSON, XML 등이 있다.

이 type들 모두 import yaml, json, xml 을 통해 nested data를 다룰 수 있다.

여기서는 import json에 대한 것만 다음 챕터에서 다룰 것이다.


2. json.loads 와 json.dump

JSON이란 무엇인지 학습한 후, json.loads()json.dumps()에 대해 알아본다.

먼저 두 함수에 대해 그림으로 간략히 표현하면 이와 같다.

image

즉, json.dumps() 는 직렬화를 하는 함수이고, json.loads()는 역직렬화를 하는 함수다.

JSON이란?

JavaScript Object Notation의 약어로, { } 중괄호(curly braces)로 둘러쌓여진 것으로, key와 value 쌍으로 쓰여진다.

  • python에서는 dictionary data type을 생각해보자.

json.loads

string을 json Object 즉, dictionary 형태로 바꾼다. (역직렬화)

1
2
3
4
5
6
7
BASE_DIR = Path(__file__).resolve().parent
secrets_path = str(BASE_DIR / "secrets.json")
with open(secrets_path) as f:
    secret = f.read()
    secret2 = json.loads(secret)
    print(f"secret type: {type(secret)}") 
    print(f"secret2 type: {type(secret2)}")

출력 결과는 다음과 같다.

1
2
secret type: <class 'str'> 
secret2 type: <class 'dict'>
  • 즉, .read() 는 json 파일은 string 문자열로 읽어오고, json.loads()는 이를 dictionry인 json object로 읽어온다.

그러면 read()와 dumps() 의 차이는 무엇일까??? 둘 다 string 을 반환하지만, dumps는 json 형태의 string으로 바꾸고, read()는 작성된 형태 그대로 읽어온다.

json.dumps

json Object를 string으로 바꿔준다. (직렬화)

  • 위에 코드를 이어서 사용해보자.
1
2
3
4
5
dump = json.dumps(secret2)
print(type(dump))

# 결과
<class 'str'>
  • 즉, json object로 넘겨주면 데이터를 추출하여 이를 string type으로 반환한다는 걸 알 수 있다.

Reference