💡 json은 javascript Object Notation의 약자로 데이터를 저장하거나 데이터 통신을 할 때 주로 사용됩니다. json을 파일로 다룰 때는 .json 확장자를 사용합니다.
서버에 있는 데이터의 형태를 클라이언트와 주고 받기 편하게 ( 주로 자바스크립를 프론트엔드에서 자주쓰이니 프론트와 주고받기 편하게) 문자열인 json으로 바꿔준다.
json의 형태는 key: value 쌍으로 이루어져 있으며, 파이썬의 dictionary 형태와 매우 유사합니다. 이러한 특성으로 인해 파이썬에서는 json 데이터를 dictionary 데이터로 변경하고, 반대로 dictionary 데이터를 json으로 변경할 수 있습니다.
예) json_str = "{'name': 'John', 'age': 30}"
있는데 이걸 json.loads라던지 json.dumps를 통해 파싱하려고 하면 에러가 발생한다.
why?
JSON형식에서의 이름(property name)은 ""큰 따옴표롤 둘러있어야하기 때문이다.
파이썬은 관계 없다(원칙은 관계있지만) => 애초에 딕셔너리 형태에 "{}" 큰따옴표가 필요없음.
json_str = {"name": "John", "age": 30} ok
json_str = {'name': 'John', 'age': 30} ok
원칙적으로 "''"큰 따옴표가 밖에 있으면 안은 '' 작은따옴표
또는 '""'작은따옴표 밖, 큰따옴표 안으로 구성되어야하는데
위의 예는 큰따옴표가 밖이라 안이 작은 따옴표로 사용되어야하는데 이 상태로는 JSON형식과는 맞지않아 JSONDecodeError에러가 뜨는것.
import json
json_str = "{'name': 'John', 'age': 30}"
# JSONDecodeError 발생
json_str = '{"name": "John", "age": 30}'
#이렇게 해야 옳게 나옴.
python_obj = json.loads(json_str)
import json
json_data = '{"name": "John", "age": 30, "city": "New York"}'
python_dict = json.loads(json_data)
print(python_dict)
출력
{'name': 'John', 'age': 30, 'city': 'New York'}
json.loads():
json_str = '{"name": "John", "age": 30}'
python_obj = json.loads(json_str)
비슷하지만 다른
json.load():
with open('data.json', 'r') as file:
python_obj = json.load(file)
import json
python_dict = {'name': 'John', 'age': 30, 'city': 'New York'}
json_data = json.dumps(python_dict)
print(json_data)
출력
{"name": "John", "age": 30, "city": "New York"}
json.dumps():
python_obj = {"name": "John", "age": 30}
json_str = json.dumps(python_obj)
여기서 잠깐 json.dump()는 또 따른 메소드다.
json.dump()
python_obj = {"name": "John", "age": 30}
with open('output.json', 'w') as file:
#open('output.json', 'w')하는데 얘 이제부터 file로부를게
json.dump(python_obj, file)
with ... as ... 구문은 파이썬의 context manager와 관련이 있습니다. 이 구문은 주로 리소스 관리와 관련된 작업을 수행할 때 사용됩니다. 예를 들어, 파일을 열거나 데이터베이스 연결을 하거나 네트워크 연결을 할 때 해당 리소스를 안전하게 사용하고 정리하기 위해 사용합니다.
파일 열기:
파일을 열 때 with ... as ... 구문을 사용하면, 파일을 수동으로 닫아주지 않아도 된다. with 블록을 빠져나오면 자동으로 파일이 닫힌다.
with open('sample.txt', 'r') as file:
data = file.read()
# 여기서 file은 이미 닫혀있습니다.
데이터베이스 연결:
데이터베이스 연결과 같은 다른 리소스들에 대해서도 비슷하게 사용할 수 있다. 연결을 안전하게 닫거나 정리하는 작업을 자동으로 처리해 준다.
with database_connection as conn:
data = conn.fetch_data()
# 여기서 conn 연결은 이미 닫혀있거나 정리되었습니다.
with ... as ... 구문의 동작 방식은 __enter__와 __exit__ 두 가지 매직 메서드에 의해 정의됩니다. 이러한 메서드들을 가진 객체를 context manager라고 합니다. with 구문은 __enter__ 메서드를 호출하며 해당 블록을 빠져나올 때 __exit__ 메서드를 호출합니다.
따라서, 여러분이 원하는 리소스 관리 기능을 가진 커스텀 context manager를 만들기 위해서는 해당 객체에 __enter
__와 __exit__ 메서드를 구현해야 합니다.
딕셔너리와 제이슨의 형태차이점:
안의 property는 ""로 무조건 감싸줘야하고 해줘야하고 맨마직막에는 ,는 없어야한다.
예){ "title": "3번쨰 직접브라우저에서 저장", "content": "직접 json을 써서 저장중" }
'' "" 상관없고, 마직막에도 , 있든 없든 상관없다.
예)my_dict = {
"key1": "value1",
"key2": "value2",
"key3": "value3",
}