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

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

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

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

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

369閲覧

jsonデータをpandasデータ化するには?

kouji_39

総合スコア164

JSON

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

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2023/06/09 13:52

編集2023/06/09 15:58

テーマ、知りたいこと

jsonデータをpandasデータ化するには?

背景、状況

あるデータを、jsonファイルでpythonで取り込み、pandasデータ形式で加工
をする予定です。複雑な入れ子のjsonデータについて、どのようにエラー回避
して、pandasデータ化する方法が知りたいです。

コード内の”test4.json"の中身は以下です。 {'metadata': {'detail': '橋:調書の様式別形式に則ったデータ取得用API', 'parameter': {'nendo': 2021.0, 'pattern': 3, 'shisetsuid': '37.×××××,139.×××××'}, 'title': '橋:調書様式別取得API'}, 'result': [{'c3': [{'diameter': '1', 'local_figs': [{'file_name': '2104230137.JPG', 'memo': '側面(全景)\r\n左が起点側', 'photo_date': '20210423', 'photo_no': 1}, {'file_name': '2107280142.JPG', 'memo': '正面(全景)\r\n手前が起点側', 'photo_date': '20210728', 'photo_no': 2}, {'file_name': '2104230136.JPG', 'memo': '径間別側面\r\n左が起点側', 'photo_date': '20210423', 'photo_no': 3}, {'file_name': '2107280140.JPG', 'memo': '橋面\r\n手前が起点側', 'photo_date': '20210728', 'photo_no': 4}, {'file_name': '2104230115.JPG', 'memo': '桁下面\r\n手前が起点側', 'photo_date': '20210423', 'photo_no': 5}, {'file_name': '2111100107.JPG', 'memo': '支承(A1橋台)', 'photo_date': '20211111', 'photo_no': 6}, {'file_name': '2111100108.JPG', 'memo': '支承(P1橋脚)', 'photo_date': '20211111', 'photo_no': 7}, {'file_name': '2111100134.JPG', 'memo': 'A1橋台', 'photo_date': '20211111', 'photo_no': 8}, {'file_name': '2111100108.JPG', 'memo': 'P1橋脚\r\n', 'photo_date': '20211111', 'photo_no': 9}, {'file_name': '211108KG55.jpg', 'memo': '点検状況\r\n点検方法:リフト車', 'photo_date': '20211111', 'photo_no': 10}, {'file_name': '211111KG01.JPG', 'memo': '点検状況\r\n点検方法:小型リフト車', 'photo_date': '20211111', 'photo_no': 11}, {'file_name': '211110KG01.JPG', 'memo': '規制状況\r\n車線減少規制', 'photo_date': '20211111', 'photo_no': 12}, {'file_name': '211111KG84.jpg', 'memo': '規制状況\r\n幅員減少規制', 'photo_date': '20211111', 'photo_no': 13}, {'file_name': '211108KG01.JPG', 'memo': 'KYミーティング', 'photo_date': '20211111', 'photo_no': 14}]}, {'diameter': '2', 'local_figs': [{'file_name': '2104230135.JPG', 'memo': '径間別側面\r\n左が起点側', 'photo_date': '20210728', 'photo_no': 15}, {'file_name': '2107280139.JPG', 'memo': '橋面\r\n手前が起点側', 'photo_date': '20210728', 'photo_no': 16}, {'file_name': '2111080046.JPG', 'memo': '桁下面\r\n手前が起点側', 'photo_date': '20211111', 'photo_no': 17}, {'file_name': '2111080074.JPG', 'memo': '支承(P2橋脚)', 'photo_date': '20211111', 'photo_no': 18}, {'file_name': '2111080091.JPG', 'memo': 'P2橋脚\r\n', 'photo_date': '20211108', 'photo_no': 19}]}, {'diameter': '3', 'local_figs': [{'file_name': '2104230134.JPG', 'memo': '径間別側面\r\n左が起点側', 'photo_date': '20210423', 'photo_no': 20}, {'file_name': '2107280138.JPG', 'memo': '橋面\r\n手前が起点側', 'photo_date': '20210728', 'photo_no': 21}, {'file_name': '2104230133.JPG', 'memo': '桁下面\r\n手前が起点側', 'photo_date': '20210423', 'photo_no': 22}, {'file_name': '2111090094.JPG', 'memo': '支承(A2橋台)', 'photo_date': '20211111', 'photo_no': 23}, {'file_name': '2104230132.JPG', 'memo': 'A2橋台', 'photo_date': '20210423', 'photo_no': 24}]}], 'nendo': 2021}], 'resultset': {'count': 1, 'is_error': False}} コードは以下です。 #複雑な構造(test4.json)は、エラー import json import pandas as pd jsonfile='test4.json' with open(jsonfile, encoding='utf-8') as f: d = json.load(f) #ノーマライズ df=pd.json_normalize(d)

エラーコードは、以下です。

JSONDecodeError Traceback (most recent call last) <ipython-input-11-b00b8da72c25> in <cell line: 6>() 5 jsonfile='test4.json' 6 with open(jsonfile, encoding='utf-8') as f: ----> 7 d = json.load(f) 8 #ノーマライズ 9 df=pd.json_normalize(d) 3 frames /usr/lib/python3.10/json/decoder.py in raw_decode(self, s, idx) 351 """ 352 try: --> 353 obj, end = self.scan_once(s, idx) 354 except StopIteration as err: 355 raise JSONDecodeError("Expecting value", s, err.value) from None JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

調査したこと・試したこと

melianさんのアドバイスである「 jsonデータをシングルコーテーションをダブルコーテーションにした
場合」、違うエラーが出た記憶があります。
6/10以降に、再度、「 jsonデータをシングルコーテーションをダブルコーテーション」したもので、
やってみます。(これで、いいのかな?)

PC環境

開発環境:Google Colaboratory
プログラム言語:python3
OS:windows10 Home
CPU:Intel(R) Core(TM) i7-7500U CPU@2.70GHz 2.90GHz

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

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

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

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

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

melian

2023/06/09 14:15

> JSONDecodeError: Expecting property name enclosed in double quotes エラーメッセージに表示されている通り、test4.json ファイル内で使われているシングルクォートをダブルクォートに変更する必要があります。 {'metadata': {'detail': ... => {"metadata": {"detail": ...
melian

2023/06/09 18:30

> 違うエラーが出た記憶があります。 それはおそらく、最後の要素で発生する json.decoder.JSONDecodeError: Expecting value ... かと思います。 ..., "is_error": False} False を文字列("False")にするか、-1 などの特定の数値にして json.load() で読み込んだ後で False に変換するなどの対応が必要になります。
bsdfan

2023/06/10 05:31

json の boolean は true, false と全部小文字で書かないといけないです。 可能なら、元のファイルをちゃんとしたjsonフォーマットで出力する方向で対処するのがいいです。
guest

回答2

0

質問の文字列はjsonというファイルに入っていますが、jsonの文法にしたがったものではないので、json文字列ではありません。 コメントにもあるように、jsonとして認識できるように変換するという手もありますが、ファイル数が多いと大変そうです。見ると、pythonのリストや辞書のリテラル表現のように見えるので、そのように扱う手もあると思います。

pythonのリテラル表現をファイルから読み込んで認識させるには ast.literal_evalを使う手があります。
https://docs.python.org/ja/3/library/ast.html#ast.literal_eval

注意: eval系の関数は、読み込むデータが不正なものであった場合にシステムを破壊する可能性があるので、入力されるデータが正しいものであることを保証できない場合は使うべきではありません。 上のドキュメントにも書いてあります。

python

1import ast 2jsonfile='test4.json' 3with open(jsonfile, encoding='utf-8') as f: 4 literal_str = f.read() 5 d = ast.literal_eval(literal_str)

投稿2023/06/10 03:57

TakaiY

総合スコア12957

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

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

kouji_39

2023/06/10 10:36

TakaiYさん、回答ありがとうございます。(なおエクセルではなく、CSVファイルに変更しました。) 追加質問したいです。 回答に従って、以下のコードを試しました。エラーは出ませんでした。 しかし、result項目に多くのデータが入り込んでしまいます。 どう対処すべきでしょうか? #Pandasをインポート import pandas as pd import json from pandas.io.json import json_normalize #変換したいJSONファイルを読み込む import ast jsonfile='test4.json' with open(jsonfile, encoding='utf-8') as f: literal_str = f.read() df = ast.literal_eval(literal_str) # read_jsonした結果だとネストしたjsonを展開できないのでnormalizeで展開させる df_json = json_normalize(df) df_json.to_csv("out.csv", encoding='utf-8')
TakaiY

2023/06/10 13:03

DFというのは、所謂CSVやプレーンなExcelのように、同じ形(カラム)の行のデータを持ったデータの集まりである必要があります。 質問のデータは、途中にあるlocal_figsのところ以外はその形に沿っていません。このデータをどのようにDFにしたいのでしょうか? 各行のカラムはどのような内容ですか? それが決っているのであれば、元のデータをそれに合せて編集してDFにすればいいでしょう。 わかっていないのであれば、まず、そこをはっきりさせる必要があります。
kouji_39

2023/06/24 10:29

TakaiYさん、返答ありがとうございます。 しばらく時間があり、json辞書データの値を取り出して、データベース化してCSVにする方法で解決しました。 今後ともよろしくお願いいたします。
guest

0

自己解決

json辞書データの値を取り出して、データベース化してCSVにする方法で解決しました。

投稿2023/06/24 11:28

kouji_39

総合スコア164

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問