json이란? 어떻게 파이썬과 데이터를 변경하고 변경받는지::loads()/data()

권수민·2023년 8월 28일
1

Json이란?

💡 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)

변환하는 법

<JSON 데이터를 파이썬 Dictionary로 변환:>

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():

  • loads 는 load string
  • Json형식의 문자열 -> 파이썬 객체(딕셔너리,리스트 등)변환
  • 주로 JSON형식의 문자열 데이터를 처리할때 사용
json_str = '{"name": "John", "age": 30}'
python_obj = json.loads(json_str)

비슷하지만 다른

json.load():

  • 파일 개체나 파일과 같은 객체에서 -> JSON데이터를 읽어 -> 파이썬 객체로 변환
  • 주로 파일에서 JSON데이터 읽을때 사용.
with open('data.json', 'r') as file:
    python_obj = json.load(file)

<파이썬 Dictionary를 JSON 데이터로 변환:>

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():

  • dumps는 dump string 의 약자이다.
  • 파이선 객체를 JSON형식의 문자열로 변환.
  • 주로 파이썬 객체 -> JSON형식의 문자열로 변경할 때 사용
    (이떄 꼭 딕셔너리 형태로 보내줘야한다.)
python_obj = {"name": "John", "age": 30}
json_str = json.dumps(python_obj)

여기서 잠깐 json.dump()는 또 따른 메소드다.

json.dump()

  • 파이썬 객체를 -> 파일객체나 파일과 같은 객체에 -> json형식으로 저장
  • 주로 파일에 JSON데이터를 저장할때 사용
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 ...

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__ 메서드를 구현해야 합니다.

딕셔너리와 제이슨의 형태차이점:

json 형태:

안의 property는 ""로 무조건 감싸줘야하고 해줘야하고 맨마직막에는 ,는 없어야한다.

예){ "title": "3번쨰 직접브라우저에서 저장", "content": "직접 json을 써서 저장중" }

딕셔너리 형태:

'' "" 상관없고, 마직막에도 , 있든 없든 상관없다.

 예)my_dict = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3",
}
profile
초보개발자

0개의 댓글