Python JSON
JSON 이란?
공식사이트 : http://www.json.org/json-ko.html
JSON 이쁘게 보기 : http://bodurov.com/jsonformatter/
- JSON: JavaScript Object Notation 약자(JavaScript 객체 표기법 구문에서 파생)
- JSON 포맷은 더글라스 크록포드가 규정
- JSON은 데이터를 저장하고 전송하는 형식입니다.
- JSON은 종종 데이터가 서버에서 웹으로 전송될 때 사용되는 페이지
- JSON은 경량 데이터 교환 형식
- JSON은 완벽하게 언어로 부터 독립적(다양한 언어에서 사용)
- 다양한 언어들에서, 이는 object, record, struct(구조체), dictionary, hash table, 키가 있는 list, 또는 연상배열(배열을 키로 참조)로서 실현
JSON Example
3명의 직원 객체를 정의예제
{
"employees":[
{"firstName":"Joo", "lastName":"Duu"},
{"firstName":"Koo", "lastName":"Kuu"},
{"firstName":"Loo", "lastName":"Luu"}
]
}
JSON형식은 자바스크립트 객체 와 코드가 일치합니다.
따라서 JSON데이터를 자바 스크립트 객체로 쉽게 변환할 수 있음
JSON 문법 규칙
- 데이터는 이름:값 의 쌍의 집합
- 데이터는
,
로 구분 {}
안에 데이터가 쓰여지면 JSON 객체(object)[]
안에 데이터가 쓰여지면 JSON 배열(array)
JSON 데이터- 이름(name)과 값(value)
name/value 쌍은 "name"
(이중 따옴표) 와 :
뒤로 값이 따라온다.
"firstName":"Joo"
JSON은 name에 ""
필요하나 JavaScript 에서는 name ""
필요 없음
JSON 객체(JSON Objects)
{}
안에 데이터가 쓰여지면 JSON 객체 가 된다.
JavaScript 처럼 객체들(objects)은 여러개의 name/value 쌍을 가질 수 있다.
{"firstName":"Joo", "lastName":"Duu"}
JSON 배열(JSON Arrays)
[]
안에 데이터가 쓰여지면 JSON 배열이 된다.
JavaScript 처럼 배열(array )은 여러개의 객체(object)를 가질 수 있다.
"employees":[
{"firstName":"Joo", "lastName":"Duu"},
{"firstName":"Koo", "lastName":"Kuu"},
{"firstName":"Loo", "lastName":"Luu"}
]
“employees” 객체는 배열로 각 배열의 값은 3개의 객체를 값으로 갖고 있다.
JSON Text 를 JavaScript Object로 변환 하기
JSON Text를 자바 스크립트로 변환하기 위해 자바 스크립트 내장 함수JSON.parse()를 사용한다.
파일명 : jsontest.html
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JsonTest.html</title>
</head>
<body>
<p id='demo'></p>
<script>
var text = '{ "employees" : [' +
'{ "firstName":"Joo" , "lastName":"Duu" },' +
'{ "firstName":"Koo" , "lastName":"Kuu" },' +
'{ "firstName":"Loo" , "lastName":"Luu" } ]}';
var obj = JSON.parse(text);
document.getElementById("demo").innerHTML = obj.employees[1].firstName
+ " " + obj.employees[1].lastName;
</script>
</body>
</html>
Pyhton JSON
json library 사용
json.dumps() : python data (dict) -> json data (str)
json.loads() : json data (str) -> python data (dict)
import json
data = {
'name' : 'ACME',
'shares' : 100,
'price' : 542.23
}
json_str = json.dumps(data)
json_dict = json.loads(json_str)
print(type(data))
print(type(json_str))
print(type(json_dict))
Web 사이트 JSON
import requests
data = requests.get('http://www.thecoding.kr/test.json')
# json을 바로 리턴
resp = data.json()
print(data)
print(resp)
print(type(resp))
print(resp['employees'])
print(resp['employees'][0])
print(resp['employees'][0]['firstName'])
Writing JSON data : json.dump()
Reading data back : json.load()
# Writing JSON data
with open('data.json', 'w') as f:
json.dump(data, f)
# Reading data back
with open('data.json', 'r') as f:
data = json.load(f)
네이버 OPEN API 로 책 검색기 만들기 – JSON
사이트 주소 : https://developers.naver.com
오픈API 이용신청
로그인 > Documents > API 공통 가이드 > 오픈API 이용신청
오픈API 사용방법
https://developers.naver.com/docs/search/book/
파일명 : jsontest.py
import urllib.request
client_id = "*****" # 애플리케이션 등록시 발급 받은 값 입력
client_secret = "*****" # 애플리케이션 등록시 발급 받은 값 입력
encText = urllib.parse.quote("파이썬")
url = "https://openapi.naver.com/v1/search/book?query=" + encText +"&display=5&sort=count"
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
response_body = response.read()
print(response_body.decode('utf-8'))
else:
print("Error Code:" + rescode)
urllib 모듈 import
- https://docs.python.org/3/library/urllib.html (파이썬 표준 라이브러리)
-
http 프로토콜 서버에 요청/응답을 할 수 있도록 도와주 라이브러리
-
request는 클라이언트의 요청을 처리
- response는 서버의 응답을 처리한다.
- parse는 URL을 분석한다.
request url 생성
-
urllib.parse.quote를 통해서 비 ASCII 문자를 UTF-8 형식으로 URL 인코딩
-
문자열은 유니코드로 구성되어있고, 바이트는 0~255사이 코드의 열
foo = '1234abcd' # 문자열(유니코드) koo = b'1234abcd' # 바이트 상수(b로 시작) foo_enc = foo.encode() # 문자열(유니코드) -> 바이트 koo_dec = koo.decode() # 바이트 -> 문자열(유니코드, utf-8) print(type(foo)) # <class 'str'> print(type(koo)) # <class 'bytes'> print(type(foo_enc)) # <class 'bytes'> print(type(koo_dec)) # <class 'str'>
Request 객체 생성 및 header 추가
- urllib.request.Request 클래스는 URL 요청과 관련된 클래
- http 통신 시 header 값을 설정하거나, HTTP request method(PUT,UPDATE,DELETE..) 등을 설정
- Request 클래스의 add_header메소드로 헤더 정보를 추가
urlopen(요청) 및 response (응답)
- urllib.request.urlopen 메소드에 매개변수로 url string 혹은 request 객체를 전달
- header 정보를 포함시 request 객체로 전달
- urlopen 메소드는 http.client.HTTPResponse 객체 리턴
- HTTPResponse 객체 메소드
-
geturl() : source 의 url을 반환(redirect 여부를 확인)
- getcode() : response의 HTTP status code 를 리턴
오류코드확인 : https://developers.naver.com/docs/search/blog/
response 객체
- status code가 200인 경우 (정상 호출)
- read() 메소드로 데이터를 읽음 (바이트형식)
- decode(‘utf-8’)을 통해서 UTF-8 형식으로 디코딩
import urllib.request
import json
def py_json_proc(data):
#print(data['total'])
#print(data['items'][0]['title'])
#print(len(data['items']))
item_len = len(data['items'])
for i in range(item_len):
book_title = data['items'][i]['title']
book_price = data['items'][i]['price']
book_discount = data['items'][i]['discount']
book_info = "제목 : {0} / 가격 : {1} / 할인가 : {2}".format(book_title, book_price, book_discount)
print(book_info)
def naver_open_book(search_word):
client_id = "*****" # 애플리케이션 등록시 발급 받은 값 입력
client_secret = "*****" # 애플리케이션 등록시 발급 받은 값 입력
search_word = search_word
search_word_enc = urllib.parse.quote(search_word)
url = "https://openapi.naver.com/v1/search/book?query=" + search_word_enc +"&display=" + book_num + "&sort=count" # json 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode == 200):
response_body = response.read()
response_body_dec = response_body.decode('utf-8')
#print(response_body_dec)
#print(type(response_body))
#print(type(response_body_dec))
json_data = json.loads(response_body)
#json_data = json.loads(response_body_dec)
py_json_proc(json_data)
else:
print("Error Code:" + rescode)
book_num = "3"
book_name = "파이썬"
#book_name = input("Enter Book Name : ")
naver_open_book(book_name)
네이버 OPEN API 책 검색기 최종
import urllib.request
import json
def py_json_proc(data):
#print(data['total'])
#print(data['items'][0]['title'])
#print(len(data['items']))
item_len = len(data['items'])
for i in range(item_len):
book_title = data['items'][i]['title']
book_price = data['items'][i]['price']
book_discount = data['items'][i]['discount']
book_info = "제목 : {0} / 가격 : {1} / 할인가 : {2}".format(book_title, book_price, book_discount)
print(book_info)
def naver_search_json(search_word):
client_id = "*****" # 애플리케이션 등록시 발급 받은 값 입력
client_secret = "*****" # 애플리케이션 등록시 발급 받은 값 입력
search_word = search_word
search_word_enc = urllib.parse.quote(search_word)
url = "https://openapi.naver.com/v1/search/book?query=" + search_word_enc +"&display=" + book_num + "&sort=count" # json 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode == 200):
response_body = response.read()
response_body_dec = response_body.decode('utf-8')
#print(response_body_dec)
#print(type(response_body))
#print(type(response_body_dec))
json_data = json.loads(response_body)
#json_data = json.loads(response_body_dec)
py_json_proc(json_data)
else:
print("Error Code:" + rescode)
book_num = "3"
prompt = """
... 1. Book Search
... 2. Blog Serach
... 3. News Serch
... 4. Quit
...
... Enter number: """
number = 0
while number != 4:
print(prompt)
number = int(input())
if number == 1:
book_name = input("Enter Book Name : ")
naver_search_json(book_name)