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

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

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

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

Python 3.x

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2237閲覧

Python3.8 APIの出力結果(json)を特定の文字でフィルタしたい。

ITOMO5963

総合スコア98

JSON

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

Python 3.x

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/03/26 11:10

編集2020/03/27 01:36

python初心者で申し訳ございません。
以下のpythonスクリプトを実行。APIで情報を取得している。
出力結果の"name"が"hoge2_hoge2"をIDのみを取得したい。(フィルタ?)
お力沿いお願いいたします。

【コード】

import os import requests #POSTリクエストを送信する import json os.environ['HTTP_PROXY'] os.environ['HTTPS_PROXY'] url = 'API URL' api = 'API キー' headers = {'X-API-KEY' : api} def main(): response = requests.get(url, headers=headers) print(response.json()) x = json.loads(response.json()) for m in x["monitors"]: if m["name"]=="hoge2_hoge2": print(m["id"]) if __name__== '__main__': main()

【出力結果】

{'monitors': [{'duration': 3, 'maxCheckAttempts': 1, 'critical': 55555, 'isMute': False, 'metric': 'custom.ping-A01.2_2_3_1', 'excludeScopes': [], 'name': 'hoge2_hoge2', 'warning': 5, 'id': '3Tn9vU7tGFS', 'scopes': [], 'type': 'host', 'operator': '>'}, {'duration': 3, 'maxCheckAttempts': 2, 'critical': 1500, 'isMute': False, 'metric': 'custom.ping-H15.2_2_9_150', 'excludeScopes': [], 'name': 'custom.ping-H15.2_2_9_150', 'warning': 200, 'id': '3QXEZcrXFMb', 'scopes': [], 'type': 'host', 'operator': '>'}, {'duration': 3, 'maxCheckAttempts': 2, 'critical': 1500, 'isMute': False, 'metric': 'custom.ping-H16.2_2_9_151', 'excludeScopes': [], 'name': 'custom.ping-H16.2_2_9_151', 'warning': 200, 'id': '3QXJNu7GjKs', 'scopes': [], 'type': 'host', 'operator': '>'}, {'critical': 1900, 'isMute': False, 'excludeScopes': [], 'memo': '回線品目:フレッツ光ネクスト\u3000マンション・ハイスピードタイプ\n回線ID:L5435-46841-7781', 'type': 'host', 'operator': '>', 'notificationInterval': 10, 'duration': 3, 'maxCheckAttempts': 2, 'metric': 'custom.ping-A01.2_2_3_1', 'name': '帯広支店ルータ死活監視', 'warning': 200, 'id': '3RWjpKzPrkE', 'scopes': []}, {'isMute': False, 'excludeScopes': [], 'name': 'connectivity', 'id': '3QPXmoYtNm9', 'scopes': [], 'type': 'connectivity'}]} Traceback (most recent call last): File "c:/Users/Pythonファイル/Get-API.py", line 31, in <module> main() File "c:/Users/Pythonファイル/Get-API.py", line 17, in main x = json.loads(response.json()) File "C:\Program Files (x86)\Python38-32\lib\json\__init__.py", line 341, in loads raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not dict ```

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

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

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

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

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

tiitoi

2020/03/26 11:14 編集

インデントが崩れてしまうので、コードや出力結果は ``` で囲ってください。 例 ``` コード ```
otn

2020/03/26 12:23

出力結果はちゃんとコピペしましょう。
ITOMO5963

2020/03/26 13:23

ご指摘ありがとうございます。修正させていただきました。
guest

回答1

0

ベストアンサー

Python

1import json 2 3x = json.loads(response.json())

で、xにJSONに対応するオブジェクトが出来るので、あとは添え字を付けて取り出せばいいです。

Python

1for m in x["monitors"]: 2 if m["name"]=="ahoge2_hoge2": 3 print(m["id"])

投稿2020/03/26 13:26

otn

総合スコア85901

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

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

ITOMO5963

2020/03/27 01:32

ご回答ありがとうございます。ですが、上手く動作しません。 "pprint"モジュールは不要と思い消してみましたが、結果は同じでした。 すみません。pprintを削除した出力です。 検証のため、前回より多くデータが出力されるようにしています。 【コード】 ``` import os import requests #POSTリクエストを送信する import json os.environ['HTTP_PROXY'] os.environ['HTTPS_PROXY'] url = 'API URL' api = 'API キー' headers = {'X-API-KEY' : api} def main(): response = requests.get(url, headers=headers) print(response.json()) x = json.loads(response.json()) for m in x["monitors"]: if m["name"]=="hoge2_hoge2": print(m["id"]) if __name__== '__main__': main() ``` 【出力結果】 ```` {'monitors': [{'duration': 3, 'maxCheckAttempts': 1, 'critical': 55555, 'isMute': False, 'metric': 'custom.ping-A01.2_2_3_1', 'excludeScopes': [], 'name': 'hoge2_hoge2', 'warning': 5, 'id': '3Tn9vU7tGFS', 'scopes': [], 'type': 'host', 'operator': '>'}, {'duration': 3, 'maxCheckAttempts': 2, 'critical': 1500, 'isMute': False, 'metric': 'custom.ping-H15.2_2_9_150', 'excludeScopes': [], 'name': 'custom.ping-H15.2_2_9_150', 'warning': 200, 'id': '3QXEZcrXFMb', 'scopes': [], 'type': 'host', 'operator': '>'}, {'duration': 3, 'maxCheckAttempts': 2, 'critical': 1500, 'isMute': False, 'metric': 'custom.ping-H16.2_2_9_151', 'excludeScopes': [], 'name': 'custom.ping-H16.2_2_9_151', 'warning': 200, 'id': '3QXJNu7GjKs', 'scopes': [], 'type': 'host', 'operator': '>'}, {'critical': 1900, 'isMute': False, 'excludeScopes': [], 'memo': '回線品目:フレッツ光ネクスト\u3000マンション・ハイスピードタイプ\n回線ID:L5435-46841-7781', 'type': 'host', 'operator': '>', 'notificationInterval': 10, 'duration': 3, 'maxCheckAttempts': 2, 'metric': 'custom.ping-A01.2_2_3_1', 'name': '帯広支店ルータ死活監視', 'warning': 200, 'id': '3RWjpKzPrkE', 'scopes': []}, {'isMute': False, 'excludeScopes': [], 'name': 'connectivity', 'id': '3QPXmoYtNm9', 'scopes': [], 'type': 'connectivity'}]} Traceback (most recent call last): File "c:/Users/itoutmv.TNC/Documents/Pythonファイル/Get-Monitoring-01.py", line 31, in <module> main() File "c:/Users/Pythonファイル/Get-API.py", line 17, in main x = json.loads(response.json()) File "C:\Program Files (x86)\Python38-32\lib\json\__init__.py", line 341, in loads raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not dict ```
otn

2020/03/27 02:18

失礼しました。json() でJSONをパースしてオブジェクトになってるんですね。 JSONが返ってきていてそれをオブジェクトにする方法がわからないのかと早合点しました。 であれば、 x = response.json() で、あとはそのまま。import jsonも不要です。
ITOMO5963

2020/03/27 02:40

ありがとうございます。 解決しましたが、もう一点不明点がございます。 "metric"が"custom.ping-H16.2_2_9_151"のIDのみを取得したい。場合にいかのエラーが出力されます。 ``` if m["metric"]=="custom.ping-H16.2_2_9_151": KeyError: 'metric' ```` KeyErrorは辞書内に指定したキーが存在しないと、KeyErrorが発生する認識です。 原因わかりますでしょうか。
otn

2020/03/27 03:10

キーが無いと言うことでしょう。 print(m)して確認しましょう。
ITOMO5963

2020/03/27 03:18

print(m)をしました。 このような結果がかえってきました。 ``` {'duration': 3, 'maxCheckAttempts': 2, 'critical': 1500, 'isMute': False, 'metric': 'custom.ping-H15.2_2_9_150', 'excludeScopes': [], 'name': 'custom.ping-H15.2_2_9_150', 'warning': 200, 'id': '3QXEZcrXFMb', 'scopes': [], 'type': 'host', 'operator': '>'} Traceback (most recent call last): File "c:/Users/Pythonファイル/Get-API1.py", line 20, in <module> main() File "c:/Users/Pythonファイル/Get-API1.py", line 15, in main if m["metric"]=="custom.ping-H15.2_2_9_150": KeyError: 'metric' ````
ITOMO5963

2020/03/27 04:20

ご回答ありがとうございます。 この件は、別で質問してみます。 ご教示有難うございます。
otn

2020/03/27 04:40

KeyErrorが出ている以上ん、何か見落としがあるはずです。 もし質問するなら、現象が発生するコードを載せましょう。 回答者が、コピペで実行して、再現するようなコード。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問