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

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

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

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

Python 3.x

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

解決済

jsonファイルのKeyErrorを一括で例外処理する方法について

kouki_prog
kouki_prog

総合スコア1

JSON

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

Python 3.x

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

2回答

1評価

1クリップ

174閲覧

投稿2022/05/16 04:05

編集2022/05/17 21:10

AmazonAPIから取得したjsonファイルの情報の抽出をしようとしています。

jsonファイルは、商品によって要素(商品サイズ等)がある場合とない場合が分かれています。

要素が無いときに、KeyErrorが発生したため、try-exceptで例外処理していますが、抽出する要素数が各商品20種類と多いためコードが長くなっています。

KeyErrorで検索して、「.get()で取得すれば要素が無いときはKeyErrorが出ない」と理解したのですが、.get()で要素を抽出しても、間の[0]で要素が見つからず、IndexErrorが発生してしまいます。
example:
json_a.get("a")[0].get("b").get("c")

IndexErrorを例外処理するかKeyErrorを例外処理するかの違いだけでした。

【質問】
要素があったりなかったりする場合、jsonからの要素の抽出は一つ一つ例外処理を書いていくしかないのでしょうか?

【変更点】
ソースコードとjsonを追記しました。

json例

json

response_json = { "asin": "B0872MYW83", "identifiers": [ { "marketplaceId": "A1VC38T7YXB528", "identifiers": [ { "identifier": "4902777309934", "identifierType": "EAN" } ] } ],   ・・・中略 "summaries": [ { "marketplaceId": "A1VC38T7YXB528", "brandName": "NEXT BODY(\u30cd\u30af\u30b9\u30c8 \u30dc\u30c7\u30a3)", "browseNode": "3457072051", "itemName": "[Amazon\u9650\u5b9a\u30d6\u30e9\u30f3\u30c9] \u660e\u6cbb \u30b6\u30d0\u30b9(SAVAS) \u30db\u30a8\u30a4\u30d7\u30ed\u30c6\u30a4\u30f3 \u30b3\u30b3\u30a2\u5473\u301051\u98df\u5206\u3011 1,071g NEXT BODY", "manufacturer": "\u660e\u6cbb", "modelNumber": "2630993", "sizeName": "1.071\u30ad\u30ed\u30b0\u30e9\u30e0 (x 1)" } ], "variations": [] }

プログラム

Python

json_tmp = json.loads(response_json) try: jan = json_tmp.get('identifiers')[0].get('identifiers')[0].get('identifier') except (IndexError,AttributeError): jan = '' try: major_rank = json_tmp.get('ranks')[0].get('ranks')[0].get('rank') except (IndexError,AttributeError): major_rank = '' try: minor_rank = json_tmp.get('ranks')[0].get('ranks')[1].get('rank') except (IndexError,AttributeError): minor_rank = '' try: junre = json_tmp.get('ranks')[0].get('ranks')[0].get('title') except (IndexError,AttributeError): junre = '' try: item_name = json_tmp.get('summaries')[0].get('itemName') except (IndexError,AttributeError): item_name = '' try: brand_name = json_tmp.get('summaries')[0].get('brandName') except (IndexError,AttributeError): brand_name = '' try: manufacturer = json_tmp.get('summaries')[0].get('manufacturer') except (IndexError,AttributeError): manufacturer = '' try: model_number = json_tmp.get('summaries')[0].get('modelNumber') except (IndexError,AttributeError): model_number = '' try: valiations = json_tmp.get('variations') except (IndexError,AttributeError): valiations = ''

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

otn

2022/05/16 08:49 編集

回答ではないですが、言語を変えると、このあたりは楽に書けます。近い言語だとRuby。
yuki23

2022/05/16 11:51

問題が何なのかよくわからないので、ソースコードを提示していただけますか?
kouki_prog

2022/05/16 15:06 編集

otn様 アドバイスいただきありがとうございます。 やっぱり、言語により得手不得手があるんですね。 知識不足の中、作成途中のアプリがPythonなので、手持ちの札でなんとかしようと四苦八苦しております。 yuki23様 ご確認いただきありがとうございます。 ソースコードを本文に追記いたしました。 よろしくおねがいします。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

JSON

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

Python 3.x

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