JSONとは:
KeyとValueのペア(連想配列、オブジェクト)
例)
let item = {
"id":1,
"name":"N95 Mask", //文字列は必ず” ” で表記
"available": ["Tokyo", "Osaka"],
"time":{ "quick":"in 3hrs","normal":"in 24hrs", "best effort": "3 days"},
"order":{"Basic":{"hospital":"100 Yen", "retailer":"200 Yen", "consumer":"300Yen"}}
}
{ }で区切るとオブジェクトを表す。
[ ]は配列を表す
各Valueには、ドットでアクセス
console.log(item.available) # ["Tokyo", "Osaka"]
console.log(item.available[0]) #Tokyo
console.log(item.time) #{quick: "in 3hrs", normal: "in 24hrs", best effort: "3 days"}
console.log(item.time.quick) # in 3hrs
console.log(item.order.basic) #{hospital: "100 Yen"}
console.log(item.order.basic.hospital) #100 Yen
sample jason dataset
people_string='''
{
"people":[
{"name":"Wayne Rigsby",
"phone":"123-456-789",
"emails":["wayne@cbi.com", "wayne2@cbi.com"],
"has_license":true},
{"name":"Patric Jane",
"phone":"987-654-321",
"emails":null,
"has_license":false}
]
}'''
*JSONファイルを辞書として読み込み
json.load()
*辞書をJSON文字列として整形して出力
json.dumps()
区切り文字を指定: 引数separators
デフォルトではキーと値の間が:、要素間が,で区切られる。
print(json.dumps(d, separators=(',', ':')))
インデントを指定: 引数indent
print(json.dumps(d, indent=4))
キーでソート: 引数sort_keys
print(json.dumps(od, sort_keys=True))
Unicodeエスケープ指定: 引数ensure_ascii
print(json.dumps(od, ensure_ascii=False))
*Javascript ObjectをJSONに変換するJS
JSON.stringify(item)
*JSONをJavascript Objectに変換するJS
JSON.perse(item)
1. jsonフォーマットのテキストデータをjson objectに変換する
import json /// <-標準ライブラリ・インストール不要
data=json.loads(people_string)
print(people_string)だとテキストとしてそのままprintされる
{
"people":[
{"name":"Wayne Rigsby",
"phone":"123-456-789", .....
print(data)だと以下のようなリスト型のjsonフォーマットに変換されていることが確認できる。
}
{'people': [{'name': 'Wayne Rigsby', 'phone': '123-456-789', 'emails': ['wayne@cbi.com', 'wayne2@cbi.com'], 'has_license': True}, {'name': 'Patric Jane', 'phone': '987-654-321', 'emails': None, 'has_license': False}]}
*リスト型なのでfor loopで取り出せる
for person in data['people']: /// キーで指定
print(person) ///output1
print(person['name'])///output2
///output1
{'name': 'Wayne Rigsby', 'phone': '123-456-789', 'emails': ['wayne@cbi.com', 'wayne2@cbi.com'], 'has_license': True}
{'name': 'Patric Jane', 'phone': '987-654-321', 'emails': None, 'has_license': False}
///output2
Wayne Rigsby
Patric Jane
*キーを指定して削除もできる
for person in data['people']:
del person['phone']
print(person)
{'name': 'Wayne Rigsby', 'emails': ['wayne@cbi.com', 'wayne2@cbi.com'], 'has_license': True}
{'name': 'Patric Jane', 'emails': None, 'has_license': False}
#辞書型の取り扱いは
2. Pythonオブジェクトをjsonフォーマットのテキストをに変換す
data=json.loads(people_string)
new_string =json.dumps(data)
print(new_string)
{"people": [{"name": "Wayne Rigsby", "phone": "123-456-789", "emails": ["wayne@cbi.com", "wayne2@cbi.com"], "has_license": "true"}, {"name": "Patric Jane", "phone": "987-654-321", "emails": "null", "has_license": "false"}]}
new_string =json.dumps(data, indent=2,sort_keys=True) ///読みやすいようにするオプション
{
"people": [
{
"emails": [
"wayne@cbi.com",
"wayne2@cbi.com"
],
"has_license": "true",
"name": "Wayne Rigsby",
"phone": "123-456-789"
},
{
"emails": "null",
"has_license": "false",
"name": "Patric Jane",
"phone": "987-654-321"
}
]
}
3. ローカルのJSONファイルを扱う
jsonファイルはこちら
https://raw.githubusercontent.com/CoreyMSchafer/code_snippets/master/Python-JSON/states.json
{
"states": [
{
"name": "Alabama",
"abbreviation": "AL",
"area_codes": ["205", "251", "256", "334", "938"]
},
{
"name": "Alaska",
"abbreviation": "AK",
"area_codes": ["907"]
},....
]
}
これをローカルフォルダに置いておく。
(読み込む)
import json
**Python Objectとして開く
with open('states.json') as f:
data = json.load(f) /// 先述のjson.loadsと混同しない
for state in data['states']:
print(state['name'],state['abbreviation'])
Alabama AL
Alaska AK
Arizona AZ......
(新しいJSONファイルとして保存)
with open('states.json') as f:
data = json.load(f)
for state in data['states']:
del (state['area_codes'])
with open('new_states.json', w) as f:
json.dump(data, f, indent=2)
4. APIで取得されるJSONデータを扱う
(ここで使われているyahoo APIは、現在は利用できない)
import json
from urllib.request import urlopen
with urlopen("https://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json") as response:
source = response.read()
print(source) ///この段階ではタグ情報も一杯。
data = json.loads(source)
# print(json.dumps(data, indent=2))///これで可読な形式に。本当に便利
usd_rates = dict()
"""
APIのJSONは
{
"list":{
"meta":{
"type":"resource-list",
"start":"0",
"count"="188"
},
"resources":[
{
"resource":{
"classname": "Quote",
"fields": {
"name":"USD/KW\RW",
"price" : "1095.34997" ...
}
}.................
]
と続いていく
////
print(len(data['list'][ "resources"]))
#188
usd_rates = dict()
for item in data['list']['resources']:
name = item['resource']['fields']['name']
price = item['resource']['fields']['price']
usd_rates[name] = price
usd_name[name] = price ///nameをキー値、priceをvalueにした辞書作成
print(50 * float(usd_rates['USD/EUR'])) ///50ドルをEURにしてみる。文字列なのでフロートに
こんな例も
#!/usr/bin/env python
try:
# For Python 3.0 and later
from urllib.request import urlopen
except ImportError:
# Fall back to Python 2's urllib2
from urllib2 import urlopen
import json
def get_jsonparsed_data(url):
response = urlopen(url)
data = response.read().decode("utf-8")
json_data = json.loads(data)
return print(json.dumps(json_data, indent=3))
url = ("https://financialmodelingprep.com/api/v3/stock/gainers?demo")
print(get_jsonparsed_data(url))
0 件のコメント:
コメントを投稿