Python – JSON 활용

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)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다