質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

3回答

418閲覧

JSONのパース方法がわからない

unkoman

総合スコア8

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/04/10 08:00

編集2018/04/10 08:02

背景
じゃらんAPI使ってWebアプリを作りたいです。
最初にじゃらんAPIを叩いて、そのリザルトを値段順に並べたいと考えています。

やったこと

Python

1import requests 2# 人間が使いやすいHTTPライブラリをimportする 3import json 4# jsonを使うからjsonモジュールをimportする 5import xmltodict 6# じゃらんAPIはデフォルトでXML形式で出力するからxmlを辞書型に変換するためにこれが必要 7key = "******" 8# APIkeyは自分の受け取ったものを使う 9url = 'http://jws.jalan.net/APIAdvance/StockSearch/V1/?key=******&s_area=137412&?screenId=UWW1402&distCd=01&contHideFlg=1&idx=0&photo=1&rootCd=041&stayYear=2018&stayMonth=4&stayDay=14&stayCount=1&roomCount=1&adultNum=2&roomCrack=200000&childPriceFlg=0,0,0,0,0&kenCd=120000&lrgCd=121100&mvTabFlg=1&vosFlg=2&activeSort=1&count=1' 10# URLは空き室検索APIのサンプルリクエストURLを用いた 11response = requests.get(url) 12# これで取得する 13xml = response.text 14# 取得したものをエンコードする(xml形式で出力される) 15result = xmltodict.parse(xml) 16# xml形式のデータを辞書型に変換する 17result_json = json.dumps(result, indent=5, ensure_ascii=False) 18# json型にエンコードする 19PRICE = result_json["Results"]["Plan"]["SampleRate"] 20# とりあえず値段の値を取得したい
出力結果 Traceback (most recent call last): line 10, in <module> PRICE = result_json["Results"]["Plan"]["SampleRate"] TypeError: string indices must be integers

エラーが出たので手動で辞書型で入力しました

Python

1data = { 2 "Results": { 3 "@xmlns": "jws", 4 "NumberOfResults": "658", 5 "DisplayPerPage": "1", 6 "DisplayFrom": "1", 7 "APIVersion": "1.2", 8 "Plan": { 9 "PlanName": "【 素泊まり 】2016年12月1日オープン!JR山手線・京成線「 日暮里 」駅から徒歩2分!", 10 "PlanCD": "02198165", 11 "RoomName": "シングル 禁煙室", 12 "RoomCD": "0360449", 13 "Facilities": { 14 "Facility": [ 15 "シングル", 16 "部屋でインターネット", 17 "禁煙ルーム", 18 "バス", 19 "トイレ" 20 ] 21 }, 22 "PlanCheckIn": "15:00", 23 "PlanCheckOut": "11:00", 24 "SplyPeriodStrDay": "20161201", 25 "SplyPeriodEndDay": "20190331", 26 "PlanPictureURL": "http://www.jalan.net/jalan/images/pictM/Y0/Y305220/Y305220027.jpg", 27 "PlanPictureCaption": "シングルルーム", 28 "Meal": "食事なし", 29 "RateType": "大人1名あたり", 30 "SampleRate": "5000", 31 "ServiceChargeRate": "0", 32 "Hotel": { 33 "HotelID": "305220", 34 "HotelName": "アパホテル<TKP日暮里駅前>", 35 "PostCode": "116-0014", 36 "HotelAddress": "東京都荒川区東日暮里5-52-9", 37 "Area": { 38 "Region": "首都圏", 39 "Prefecture": "東京都", 40 "LargeArea": "上野・浅草・両国", 41 "SmallArea": "荒川・足立" 42 }, 43 "HotelType": "ホテル", 44 "HotelCatchCopy": "【2016/12/1日暮里駅前にオープン!】成田空港まで40分乗換なし!", 45 "HotelCaption": "【日暮里駅南改札より2分!】山手線で新宿・上野まで乗換えなし。飲食店やコンビニも近く出張・観光の拠点に◎全室50インチ以上の大型TV!自分だけの快適空間を。忙しい朝もフリーチェックアウトで1秒出発♪", 46 "PictureURL": "http://www.jalan.net/jalan/images/pictM/Y0/Y305220/Y305220021.jpg", 47 "PictureCaption": "外観【夜】", 48 "X": "503193484", 49 "Y": "128606098", 50 "HotelNameKana": "あぱほてるてぃーけーぴーにっぽりえきまえ", 51 "NumberOfRatings": "93", 52 "Rating": "4" 53 } 54 } 55 } 56} 57 58PRICE = data["Results"]["Plan"]["SampleRate"] 59print(PRICE)#5000 60

この違いがどうして出てしまうのでしょうか。調べると、それっぽいことが出てくるのですが、何を行っているのかわかりません。どなたかご教授下さい????

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ドキュメントを読むとわかりますが、dumpsの返り値はjson「文字列」です。

19.2. json — JSON エンコーダおよびデコーダ — Python 3.6.5 ドキュメント

できなくて当然です。

この場合、xmltodictを使って辞書型への変換はできているのだから、その辞書を対象に処理していけば良いのではないでしょうか。

投稿2018/04/10 08:09

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unkoman

2018/04/10 08:13

なるほど、正直自分で扱ってるデータの型についても、あまり良く分かってない状態なので勉強します。とりあえず、仰る通り、result = xmltodict.parse(xml)によって生成された辞書を対象に、問題なくPRICEの値が帰ってきました!
hayataka2049

2018/04/10 08:31

最初のうちは、処理結果の値と、その結果の型(type(変数)で取得できます)をprintして確認するようにすると良いです。どのように処理が進んでいくのか理解が深まります
guest

0

json.dumpsは、オブジェクトを文字列に変換する働きをします。
目的を満たすのはjson.loadsかと。

詰まったら一回リファレンスを見てみると良いですよ。
Python 標準ライブラリ - json — JSON エンコーダおよびデコーダ

投稿2018/04/10 08:05

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unkoman

2018/04/10 08:07

なるほど、ありがとうございます。リファレンスを見るの大事ですね。癖つけていきます。
guest

0

手探りコードを書く場合、pythonにはインタラクティブシェルという便利なツールがあります。
データを加工しながら値をチェックできるので重宝すると思います。

投稿2018/04/10 08:21

arch_

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問