2019년 10월 27일 일요일

python에서 json 다루기


json 기본 개념

python 입장에서보는 구조는 list, dictionary 2가지 데이터가 혼합된 형태입니다. list는 [ value, value, ... ] 사이의 값을 표현하며, dictionary는 { key:value, key:value, ... } 로 표현되며 key:value 형태의 쌍을 지닙니다. value 는 또 다른 list나 dictionary가 될 수 있습니다. json 규격에서 key의 중복을 할 수 없다 라는 표현은 없지만 python에서는 dict에 loading이 되므로 뒤쪽에 갱신되는 값에 의해서 변경됩니다.

예)
{
 "TAG1":10,
 "TAG2":20,
 "TAG3":[30,40,50],
 "TAG4":{"SUB1":5,"SUB2":6},
 "TAG1":1
}

python으로 값을 읽을 때의 결과)
{'TAG1': 1, 'TAG2': 20, 'TAG3': [30, 40, 50], 'TAG4': {'SUB1': 5, 'SUB2': 6}}

TAG1이 1로 변경됨을 알 수 있습니다.


json 파일 열기


json 모듈 사용하여 load() 함수 호출하면 dict class타입으로 리턴합니다.

import json

file = open("test.json","r",encoding='utf-8')
jsondata = json.load(file)

print(type(jsondata))
print(jsondata)
실행 결과
<class 'dict'>
{'TAG1': 1, 'TAG2': 20, 'TAG3': [30, 40, 50], 'TAG4': {'SUB1': 5, 'SUB2': 6}}


json 내용 출력하기

json.dumps()함수를 이용하면 내용을 string으로 출력가능하며 해당 결과를 파일로도 저장할 수 있습니다.

import json

file = open("test.json","r",encoding='utf-8')
jsondata = json.load(file)

print(type(jsondata))
print(jsondata)

print(json.dumps(jsondata,indent='\t'))
결과
<class 'dict'>
{'TAG1': 1, 'TAG2': 20, 'TAG3': [30, 40, 50], 'TAG4': {'SUB1': 5, 'SUB2': 6}}
{
 "TAG1": 1,
 "TAG2": 20,
 "TAG3": [
  30,
  40,
  50
 ],
 "TAG4": {
  "SUB1": 5,
  "SUB2": 6
 }
}

여러개의 json 데이터 합치기

python에 json을 로딩하면 dict class가 됩니다. 결국 dict를 여러개 합치는것과 동일합니다. update()함수를 이용하여 합치면 되는데, 중복된 데이터가 있을 경우 어떤쪽으로 합치는지 살펴보고 진행해야 합니다.

예제)
test.json
{
 "TAG1":10,
 "TAG2":20,
 "TAG3":[30,40,50],
 "TAG4":{"SUB1":5,"SUB2":6},
 "TAG1":1
}
test2.json
{
 "TAG2":3000
}

test.json내용에 test2.json의 TAG2를 적용해서 test.json을 바꾸려고 합니다.
이때의 코드는 아래 참고 바랍니다.
import json

file = open("test.json","r",encoding='utf-8')
jsondata = json.load(file)

file = open("test2.json","r",encoding='utf-8')
jsondata2 = json.load(file)

print(jsondata)
print(jsondata2)
print("update")

jsondata.update(jsondata2)

print(jsondata)
결과)
{'TAG1': 1, 'TAG2': 20, 'TAG3': [30, 40, 50], 'TAG4': {'SUB1': 5, 'SUB2': 6}}
{'TAG2': 3000}
update
{'TAG1': 1, 'TAG2': 3000, 'TAG3': [30, 40, 50], 'TAG4': {'SUB1': 5, 'SUB2': 6}}

jsondata.update(jsondata2) 코드에 의해서 update는 dict의 내용을 갱신할때 사용합니다.

json 파일의 저장

앞에서 json을 string으로 변환하는것을 살펴봤습니다. 비슷하게 json.dump()함수를 이용합니다.
with open('output.json','w') as f:
 json.dump(jsondata,f,indent='\t')

전체 예제 코드 입니다.
import json

file = open("test.json","r",encoding='utf-8')
jsondata = json.load(file)

file = open("test2.json","r",encoding='utf-8')
jsondata2 = json.load(file)

print(jsondata)
print(jsondata2)
print("update")

jsondata.update(jsondata2)

print(jsondata)

with open('output.json','w') as f:
 json.dump(jsondata,f,indent='\t')
결과)
{'TAG1': 1, 'TAG2': 20, 'TAG3': [30, 40, 50], 'TAG4': {'SUB1': 5, 'SUB2': 6}}
{'TAG2': 3000}
update
{'TAG1': 1, 'TAG2': 3000, 'TAG3': [30, 40, 50], 'TAG4': {'SUB1': 5, 'SUB2': 6}}
output.json 파일 내용
{
 "TAG1": 1,
 "TAG2": 3000,
 "TAG3": [
  30,
  40,
  50
 ],
 "TAG4": {
  "SUB1": 5,
  "SUB2": 6
 }
}



댓글 없음:

댓글 쓰기