JSON (JavaScript Object Notation)
데이터 저장 및 교환을 위한 텍스트 형식이다. JSON 구문은 Python과 매우 유사하며 사용자 친화적이다. CSV의 경우 Python에는 JSON 형식의 데이터를 쉽게 쓰고 읽을 수 있는 모듈이 있다.
Reading
# sw_templates.json
{
"access": [
"switchport mode access",
"switchport access vlan",
"switchport nonegotiate",
"spanning-tree portfast",
"spanning-tree bpduguard enable"
],
"trunk": [
"switchport trunk encapsulation dot1q",
"switchport mode trunk",
"switchport trunk native vlan 999",
"switchport trunk allowed vlan"
]
}
json 모듈에서 읽는 방법에는 두 가지가 있다.
|
json.load
# JSON 파일을 Python 객체로 읽기
import json
with open('sw_templates.json') as f:
templates = json.load(f)
print(templates)
for section, commands in templates.items():
print(section)
print('\n'.join(commands))
$ python json_read_load.py
{'access': ['switchport mode access', 'switchport access vlan', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'], 'trunk': ['switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan']}
access
switchport mode access
switchport access vlan
switchport nonegotiate
spanning-tree portfast
spanning-tree bpduguard enable
trunk
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk native vlan 999
switchport trunk allowed vlan
json.loads
# JSON 문자열을 Python 객체로 읽기
import json
with open('sw_templates.json') as f:
file_content = f.read()
templates = json.loads(file_content)
print(templates)
for section, commands in templates.items():
print(section)
print('\n'.join(commands))
Writing
JSON 형식으로 파일을 작성하는 것도 상당히 쉽다. json 모듈에서 JSON 형식으로 정보를 작성하는 두 가지 방법도 있다.
|
json.dumps()
# 객체를 JSON 형식의 문자열로 변환
import json
trunk_template = [
'switchport trunk encapsulation dot1q', 'switchport mode trunk',
'switchport trunk native vlan 999', 'switchport trunk allowed vlan'
]
access_template = [
'switchport mode access', 'switchport access vlan',
'switchport nonegotiate', 'spanning-tree portfast',
'spanning-tree bpduguard enable'
]
to_json = {'trunk': trunk_template, 'access': access_template}
with open('sw_templates.json', 'w') as f:
f.write(json.dumps(to_json))
with open('sw_templates.json') as f:
print(f.read())
json.dumps 메서드는 JSON 형식의 문자열을 반환하려는 상황에 적합하다. 예를 들어, API에 전달한다.
json.dump
# JSON 파일에 Python 객체 쓰기
import json
trunk_template = [
'switchport trunk encapsulation dot1q', 'switchport mode trunk',
'switchport trunk native vlan 999', 'switchport trunk allowed vlan'
]
access_template = [
'switchport mode access', 'switchport access vlan',
'switchport nonegotiate', 'spanning-tree portfast',
'spanning-tree bpduguard enable'
]
to_json = {'trunk': trunk_template, 'access': access_template}
with open('sw_templates.json', 'w') as f:
json.dump(to_json, f)
with open('sw_templates.json') as f:
print(f.read())
JSON 형식의 정보를 파일에 쓰고 싶을 때는 dump메소드를 사용하는 것이 좋다.
Additional parameters of write methods
dump 및 dumps 메서드는 추가 매개 변수를 전달하여 출력 형식을 관리할 수 있다.
기본적으로 이러한 메서드는 간략한 보기에 정보를 쓴다. 일반적으로 다른 프로그램에서 데이터를 사용하는 경우 데이터의 시각적 표현은 중요하지 않다. 파일의 데이터를 사람이 읽어야 하는 경우 이 형식은 인식하기가 편리하지 않다. 다행스럽게도 json모듈을 사용하면 이러한 것들을 관리할 수 있다.
dump 메소드 (또는 dumps)에 추가 매개변수를 전달하면 더 읽기 쉬운 출력을 얻을 수 있다.
import json
trunk_template = [
'switchport trunk encapsulation dot1q', 'switchport mode trunk',
'switchport trunk native vlan 999', 'switchport trunk allowed vlan'
]
access_template = [
'switchport mode access', 'switchport access vlan',
'switchport nonegotiate', 'spanning-tree portfast',
'spanning-tree bpduguard enable'
]
to_json = {'trunk': trunk_template, 'access': access_template}
with open('sw_templates.json', 'w') as f:
json.dump(to_json, f, sort_keys=True, indent=2)
with open('sw_templates.json') as f:
print(f.read())
{
"access": [
"switchport mode access",
"switchport access vlan",
"switchport nonegotiate",
"spanning-tree portfast",
"spanning-tree bpduguard enable"
],
"trunk": [
"switchport trunk encapsulation dot1q",
"switchport mode trunk",
"switchport trunk native vlan 999",
"switchport trunk allowed vlan"
]
}
Changing data type
JSON 형식으로의 데이터 변환의 또 다른 중요한 측면은 데이터가 Python의 소스 데이터와 항상 동일한 유형이 아니라는 것이다.
예를 들어, 튜플을 JSON에 작성하면 목록이 된다.
import json
trunk_template = ('switchport trunk encapsulation dot1q',
'switchport mode trunk',
'switchport trunk native vlan 999',
'switchport trunk allowed vlan')
print(type(trunk_template))
<class 'tuple'>
with open('trunk_template.json', 'w') as f:
json.dump(trunk_template, f, sort_keys=True, indent=2)
cat trunk_template.json
[
"switchport trunk encapsulation dot1q",
"switchport mode trunk",
"switchport trunk native vlan 999",
"switchport trunk allowed vlan"
]
templates = json.load(open('trunk_template.json'))
type(templates)
list
print(templates)
['switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan']
JSON은 다른 데이터 유형을 사용하고 모든 Python 데이터 유형에 대해 일치하는 항목이 없다.
Limitation on data types
튜플이 키로 있는 경우 JSON 형식으로 사전을 작성할 수 없다.
to_json = {('trunk', 'cisco'): trunk_template, 'access': access_template}
with open('sw_templates.json', 'w') as f:
json.dump(to_json, f)
TypeError: key ('trunk', 'cisco') is not a string
추가 매개변수를 사용하면 다음과 같은 키를 무시할 수 있다.
to_json = {('trunk', 'cisco'): trunk_template, 'access': access_template}
with open('sw_templates.json', 'w') as f:
json.dump(to_json, f, skipkeys=True)
cat sw_templates.json
{"access": ["switchport mode access", "switchport access vlan", "switchport nonegotiate", "spanning-tree portfast", "spanning-tree bpduguard enable"]}
그 외에도 사전 키는 JSON의 문자열일 수 있다. 그러나 파이썬 사전에서 숫자를 사용하면 오류가 발생하지 않는다. 그러나 숫자에서 문자열로의 변환은 발생한다.
d = {1:100, 2:200}
json.dumps(d)
'{"1": 100, "2": 200}'
https://pyneng.readthedocs.io/en/latest/book/17_serialization/json.html
'Programming > Python' 카테고리의 다른 글
[Python] YAML (YAML Ain’t Markup Language) (0) | 2022.08.17 |
---|---|
UnicodeEncodeError: 'cp949' codec can't encode character illegal multibyte sequence (0) | 2022.08.17 |
[Python] CSV (Comma-Separated Value) (0) | 2022.08.17 |
[Python] datetime (0) | 2022.08.17 |
[Python] zip (0) | 2022.08.07 |