超基本ですが、最近始めたばかりで覚えられないので。
今回扱うjsonのデータ
{ "kind":"cat", "name":"nina", "age":10, "id":"abc", "items":[ { "kind":"color", "rarity":"common", "id":"silver" }, { "kind":"texture", "rarity":"epic", "color":"gold" }, { "kind":"claw", "rarity":"legendary", "name":"dragon claw" }, { "numbers":[20,40,50,99], "strs":["z","y","x","w"], "arrays":[[1,2,3],["a","b","c"]] } ] }
こいつを文字列として使いたい場合は、秀丸などにコピペして以下を行ってください。
ちなみにPythonで複数のコメントアウトをする場合は以下のように"""で囲います。 """ この部分はコメントになる """
文字列をjsonとして認識する
json.loadsメソッドを使います。第一引数にjsonの文字列を渡します。
json_str = "{\"kind\":\"cat\",\"name\":\"nina\",\"age\":10,\"id\":\"abc\",\"items\":[{\"kind\":\"color\",\"rarity\":\"common\",\"id\":\"silver\"},{\"kind\":\"texture\",\"rarity\":\"epic\",\"color\":\"gold\"},{\"kind\":\"claw\",\"rarity\":\"legendary\",\"name\":\"dragon claw\"},{\"numbers\":[20,40,50,99],\"strs\":[\"z\",\"y\",\"x\",\"w\"],\"arrays\":[[1,2,3],[\"a\",\"b\",\"c\"]]}]}" json_data = json.loads(json_str) print("json_str type is " + str(type(json_str))) print("json_data type is " + str(type(json_data)))
json_dataがjsonのデータとなります。
型情報の出力は以下のようになるはずです。
json_str type is <class 'str'> json_data type is <class 'dict'>
ファイルから読み込んだ内容をjsonとして認識する
json.loadメソッドを使います。第一引数にjsonが書かれたファイルのファイルディスクリプタを渡します。
with open( os.path.join(os.getcwd(),'sample.json') ) as f: json_data = json.load(f) print("json_data type is " + str(type(json_data)))
jsonデータを文字列化する
json.dumpsメソッドを使います。第一引数にjsonの文字列を渡します。
json_str = "{\"kind\":\"cat\",\"name\":\"nina\",\"age\":10,\"id\":\"abc\",\"items\":[{\"kind\":\"color\",\"rarity\":\"common\",\"id\":\"silver\"},{\"kind\":\"texture\",\"rarity\":\"epic\",\"color\":\"gold\"},{\"kind\":\"claw\",\"rarity\":\"legendary\",\"name\":\"dragon claw\"},{\"numbers\":[20,40,50,99],\"strs\":[\"z\",\"y\",\"x\",\"w\"],\"arrays\":[[1,2,3],[\"a\",\"b\",\"c\"]]}]}" json_data = json.loads(json_str) print(json.dumps(json_data))
jsonデータをファイル出力する
json.dumpメソッドを使います。第一引数にjsonのデータを、第二引数に出力するファイルのファイルディスクリプタを、第三引数以降にオプションを指定します。今回はインデントを4に指定しています。 json_str = "{\"kind\":\"cat\",\"name\":\"nina\",\"age\":10,\"id\":\"abc\",\"items\":[{\"kind\":\"color\",\"rarity\":\"common\",\"id\":\"silver\"},{\"kind\":\"texture\",\"rarity\":\"epic\",\"color\":\"gold\"},{\"kind\":\"claw\",\"rarity\":\"legendary\",\"name\":\"dragon claw\"},{\"numbers\":[20,40,50,99],\"strs\":[\"z\",\"y\",\"x\",\"w\"],\"arrays\":[[1,2,3],[\"a\",\"b\",\"c\"]]}]}" json_data = json.loads(json_str) with open( os.path.join(os.getcwd(),'sample_out.json'), 'w' ) as f: json.dump(json_data, f, indent=4)
jsonデータへのアクセス
[]で順に追っていくだけで目的のデータにアクセス可能です。
json_str = "{\"kind\":\"cat\",\"name\":\"nina\",\"age\":10,\"id\":\"abc\",\"items\":[{\"kind\":\"color\",\"rarity\":\"common\",\"id\":\"silver\"},{\"kind\":\"texture\",\"rarity\":\"epic\",\"color\":\"gold\"},{\"kind\":\"claw\",\"rarity\":\"legendary\",\"name\":\"dragon claw\"},{\"numbers\":[20,40,50,99],\"strs\":[\"z\",\"y\",\"x\",\"w\"],\"arrays\":[[1,2,3],[\"a\",\"b\",\"c\"]]}]}" json_data = json.loads(json_str) print(json_data["kind"]) print(json_data["name"]) print(json_data["age"]) print(json_data["id"]) print(json_data["items"][0]["kind"]) print(json_data["items"][1]["kind"]) print(json_data["items"][2]["kind"]) print(json_data["items"][3]["numbers"][1]) print(json_data["items"][3]["arrays"][1][2])
結果は以下。
cat nina 10 abc color texture claw 40 c
また[]が長くなりすぎる場合など、途中の配列オブジェクトを取得してそこから辿ることも可能です。
json_str = "{\"kind\":\"cat\",\"name\":\"nina\",\"age\":10,\"id\":\"abc\",\"items\":[{\"kind\":\"color\",\"rarity\":\"common\",\"id\":\"silver\"},{\"kind\":\"texture\",\"rarity\":\"epic\",\"color\":\"gold\"},{\"kind\":\"claw\",\"rarity\":\"legendary\",\"name\":\"dragon claw\"},{\"numbers\":[20,40,50,99],\"strs\":[\"z\",\"y\",\"x\",\"w\"],\"arrays\":[[1,2,3],[\"a\",\"b\",\"c\"]]}]}" json_data = json.loads(json_str) items_array = json_data.get("items", []) print(items_array[1]["rarity"]) items_array_of_array = items_array[3]["arrays"][0] print(items_array_of_array[0])
結果は以下のようになる。
epic 1
実用例
youtubeオブジェクトを作成するためのdeveloperKeyについては、Youtube Developerへの登録が必要です。
以下の記事を参考に登録・APIキーの取得を行ってください。
Youtube APIで生放送のアーカイブの全コメントを拾ったり、スパチャ額の合計を取得する方法 - 結果だけでなく過程も見てください
※注意事項※
youtubeのsearchには一日に取得できる上限があるため、途中でテストできなくなる可能性があります。 やたらと無駄にクエリーを投げないようにしましょう!
Youtube(2020/10/31現在)のチャンネルIDからビデオID一覧を含むjsonデータをファイル出力する
from apiclient.discovery import build import json import os from bs4 import BeautifulSoup import ast import requests import requests_html import re import sys import glob from retry import retry def get_api_auth_youtube(): youtube = build('youtube', 'v3', developerKey='<ここについては↑で言った通り別記事を参考にしてください') return (youtube) @retry(EOFError, tries=5, delay=10) def get_video_id_list(youtube, channel_id): curToken = None search_response = youtube.search().list( part = "id,snippet", channelId = channel_id, maxResults = 2, # クエリー投げすぎ防止のため2件としておきます order = "date", # 日付順にソートします pageToken = curToken ).execute() with open( os.path.join(os.getcwd(),'sample_out2.json'), 'w' ) as f: json.dump(search_response, f, indent=4) if __name__ == '__main__': youtube = get_api_auth_youtube() get_video_id_list(youtube, '<お好きなチャンネルID>')
チャンネルIDは特定のチャンネルのURLの末尾にある文字列のことを指します。
今後やりたいこと
- 日本語などの文字コードの整理
- ファイル入力・出力などのオプション整理