Pythonで文字列になったJSONデータを辞書型にする方法
PythonでJSONファイルの辞書型データをread関数で読み込むと、すべてのデータが1つの文字列になってしまったので、それを辞書型データとして扱えるようにする方法について紹介します。
※read関数はテキストファイルの文字列を読み込む関数です。
目次
・JSONデータが文字列になった原因
・JSONファイルの様子
・文字列を辞書型データにするプログラム
・辞書型データをJSONファイルに書き込むプログラム
JSONデータが文字列になった原因
JSONファイルのデータが1つの文字列になった原因について
JSONファイルに対して、テキストに文字列を追加する‘a'(追記モード)を使って辞書型データを追加すると、json.load関数でデータを読み込めなくなります。
そして、テキストファイルの文字列を読み込むread関数を使えば読み込むことができるのですが、そのread関数を使って読み込んだことが原因で、辞書型データの中カッコ”}” や コロン”:”などすべてが1つの文字列になり、辞書型データの取り出し方ができなくなります。
※json.load関数はJSONファイルのデータを読み込むときに使う関数です。
JSONファイルに書き込み”w”と追記”a”をしたプログラムがこちら↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import json id_info={'1001':'一郎','1002':'二郎','1003':'三郎'} #JSONファイルに書き込み js_w=open('json_f/js_py3.json','w') json.dump(id_info,js_w,indent=2) js_w.close() #JSONファイルに追記 id_info={'1001':21,'1002':22,'1003':23} #"a"で追記 js_w=open('json_f/js_py3.json','a')#追記モード json.dump(id_info,js_w,indent=2) js_w.close() |
JSONファイルの様子
この投稿で使うJSONファイルをメモ帳で開いた様子になります。

read関数で読み込んでから、print文で表示した様子になります。
type関数で型の確認もしています。

JSONファイルをメモ帳で開いた様子とprint文で表示した様子からこのJSONデータは
リストの中に2つの辞書型データが入っていなくて、なおかつ辞書型データ間のカンマ(,)がないので、同じJSONファイル内に辞書型データが別々に入っている状態です。
read関数で読み込んで、print文で表示するプログラムがこちら↓
1 2 3 4 5 6 7 8 |
import json js_r=open('json_f/js_py3.json','r') j_data=js_r.read()#read関数で読み込み js_r.close() print(j_data) print(type(j_data))#型の確認 |
文字列を辞書型データにするプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import json js_r=open('json_f/js_py3.json','r') j_data=js_r.read()#json.load関数が使えないから、readで読み込みます js_r.close() j_list=j_data.split("}")#splitで区切って、リストにすると最後に余分な部分ができるので、消します del j_list[(len(j_list)-1)]#余分な部分ができるので、消します j_list[0]=j_list[0]+"}"#中カッコ"}"を軸にリストをすると、中カッコ"}"が消えるので、足しています。 j_list[1]=j_list[1]+"}" import ast for i in range(len(j_list)): dic = ast.literal_eval(j_list[i])#文字列を辞書型データにしています。 j_list[i]=dic#辞書型データを文字列だった場所に代入 print(j_list) print(j_list[0]['1001']) |
プログラムの説明をします。
3~5行目はJSONファイルをread関数を使って読み込み、そのデータを変数j_dataに格納しています。
7行目は2つの辞書型データが1つの文字列になっているので、split関数を使って中カッコ”}”を軸に文字列のデータを分けてから、リストにしています。
split関数についての投稿はこちら↓
「Pythonのsplit関数とstrip関数について例文を用いて解説します」
8行目は中カッコ”}”を軸にsplit関数を使ってリストにすると、最後に空文字のデータができてしまうので、del関数を使って消しています。
9、10行目は中カッコ”}”を軸にして、リストを作ると中カッコ”}”が消えてしまうので、プラス演算子(+)で足しています。
12行目は文字列を辞書型データにするastモジュールを追加しています。
14~16行目はリストに入った辞書型データのような文字列を、astモジュールのast.literal_eval関数で辞書型データにしています。そして、その辞書型データを文字列だった場所に代入しています。
18、19行目のprint文を実行した様子↓

これをJSONファイルに書き直せば、辞書型データとして扱えるJSONファイルができます。
辞書型データをJSONファイルに書き込むプログラム
1 2 3 4 |
#JSONファイルに書き込む js_w=open('json_f/js_py3.json','w') json.dump(j_list,js_w,indent=2) js_w.close() |
「文字列を辞書型データにするプログラム」の19行目の下に、このプログラムを追加すればJSONファイルに辞書型データが書き込まれます。
JSONファイルをメモ帳で開いた様子↓

pythonプログラムで表示した様子↓

この投稿以外にPythonとJSONを使った投稿がこちら↓