본문 바로가기
Programming/Python

[Python] JSON (JavaScript Object Notation)

by goatlab 2022. 8. 17.
728x90
반응형
SMALL

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 객체를 반환한다.
  • json.loads : JSON 형식의 문자열을 읽고 Python 개체를 반환한다.

 

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.dump : JSON 형식의 파일에 Python 개체를 쓴다.
  • json.dumps : 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 데이터 유형에 대해 일치하는 항목이 없다.

 

Python 데이터 테이블을 JSON으로 변환
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

 

Work with JSON files - Python for network engineers

Previous Work with CSV files

pyneng.readthedocs.io

 

728x90
반응형
LIST