みなさんこんにちは!プログラミングを初めたてのころ、JSONファイルって意外と扱うのが難しいですよね?しかし、きちんと理解してしまえば難しいことは何もありません!
今日はPythonを使ってJSONを扱えるようになるということを目標に記事を書いていきますので、参考にしていただければ幸いです!
JSONとは
まず初めにJSONとは何ぞや??という方もいると思うので簡単に解説しておきます。JSONとはJavaScript Object Notation略で簡単に言えばテキストデータのデータフォーマットです。
データフォーマットとは、どのようなデータ構造になっているか、ということですね。つまり、機械が読み取れるようにJSONという規則にのっとってテキストデータを記述していきましょうよ、というお約束のことです。
似たものにXMLなどもありますが、XMLよりも簡潔で構造化されているため人間が視覚的に理解しやすいのが特徴ですね。また、実際のJSONの書き方や詳しいことはこちらの記事で紹介しているの気になる方はみてみてください。
PythonでJSONを扱おう!
それでは実際にPythonを使ってJSONファイルを扱って行きましょう!今回は以下のサンプルを用意しました。
test.json
{ "user1": { "name": "samurai tarou", "age": 23, "hobby": { "outdoor": "ski", "indoor": "movie" } } }
json loadでファイルを読み込もう!
さて、実際にPythonでjsonを扱うには標準ライブラリを使うので、
import json
このようにimportすることを忘れないようにしておきましょう。実際にコードをみていきます。
import json json_file = open('test.json', 'r') json_object = json.load(json_file) print (json_object)
きちんと、一行目でjsonをインポートして、3行目でJSONファイルを開いています。ここでは、
open(‘jsonファイルへのパス’, ‘r’)
とするようにしましょう。 まだここでは、ファイルを読み込みファイルとして開いただけです。
次にjson.loadを使います。json.loadによって、ディクショナリ型として読み込めました。つまりJSONのオブジェクトとして読み込むことができました。
Pythonではjson.loadを使うと辞書型で返ってくるということは大切なので覚えておきましょう。実行結果をみてみると、
{'user1': {'name': 'samurai tarou', 'age': 23, 'hobby': {'outdoor': 'ski', 'indoor': 'movie'}}}
はい、きちんとJSONを読み込めていますね。
辞書型とは?
先程、辞書型で値が返ってくるといいましたが、辞書型はディクショナリ型ともいわれる配列の一種です。
keyとvalueで一つの要素が成り立つのが辞書型ですが、辞書型で返ってくることによって要素を切り出せたり、扱いやすかったりするのでそのような仕様になっています。
値を実際に取り出してみよう!
さて、折角辞書型で返ってきたので値を切り出して取り出して見ましょう。こちらはコードを見たほうが分かりやすいです。
import json json_file = open('test.json', 'r') json_object = json.load(json_file) print (json_object["user1"]) print (json_object["user1"]["name"]) print (json_object["user1"]["hobby"]) print (json_object["user1"]["hobby"]["outdoor"])
{'name': 'samurai tarou', 'age': 23, 'hobby': {'outdoor': 'ski', 'indoor': 'movie'}} samurai tarou {'outdoor': 'ski', 'indoor': 'movie'} ski
辞書型で返ってくるのでこのようにkeyを指定してやることでvalueの値を抜き出せます。
json loadsとは
先程json.loadで辞書型でファイルを読み込みましたが、実はjson.loadとjson.loadsは違います。json.loadはファイルを辞書型で読み込むものに対し、json.loadsは文字列を辞書型に変換するものです。
つまり、loads関数とは、文字列をデコード(扱いやすい型に変換)してくれます。以下で、でてくる、json.dumpとjson.dumpsも違うものなので間違えないようにしましょう。
json dumpsでJSONを文字列で扱おう!
load関数ではディクショナリ型で返ってきますが、時にはJSON形式の文字列として扱いたいときもあります。その時はjson dumpsを使ってやることによって文字列に変換できます。dumps関数はエンコード(文字列に変換)してくれる関数です。
import json json_file = open('test.json', 'r') json_object = json.load(json_file) print(type(json_object)) print(json_object) print(json_object["user1"]) json_string = json.dumps(json_object) print("****************************") print(type(json_string)) print(json_string) # print(json_string["user1"]) # ただの文字列なのでエラーになる
<class 'dict'> {'user1': {'name': 'samurai tarou', 'age': 23, 'hobby': {'outdoor': 'ski', 'indoor': 'movie'}}} {'name': 'samurai tarou', 'age': 23, 'hobby': {'outdoor': 'ski', 'indoor': 'movie'}} **************************** <class 'str'> {"user1": {"name": "samurai tarou", "age": 23, "hobby": {"outdoor": "ski", "indoor": "movie"}}}
実行結果を見て分かる通り、文字列になっていますね。16行目はエラーになるのでコメントアウトしていますが、ただの文字列なのでもちろんこのような指定はできません。
値を書き換えて上書きしよう
JSONをうまく表示することはできましたが、書き込みたい、変更したいということもあるかと思います。なので最後に、受け取ったJSONオブジェクトの中身を変更してjsonファイルを上書きする方法についても説明していきます。
import json json_file = open('test.json', 'r') json_object = json.load(json_file) json_object["user1"]["name"] = "samurai kotaro" new_json_file = open('test.json', 'w') json.dump(json_object, new_json_file, indent=2)
open('新規JSONファイル', 'w')
このように、読み込みではなくwを使って書き込みファイルとして開きます。そして、実際に書き出すにはjson.dump関数を使って、第一引数にJSONオブジェクト、第二引数に書き込むファイルを指定します。
また、そのままdumpすると、インデントや改行などがなく見にくいので第三引数で整形オプションを入れてやります。
{ "user1": { "name": "samurai kotaro", "age": 23, "hobby": { "outdoor": "ski", "indoor": "movie" } } }
このように、変更が反映されてかつ見やすくなっていますね。
まとめ
いかがでしたか。今日は、jsonとは何か、json loads、json dumpsの使い方や返ってくる型の違い、JSONファイルの書き込みということについて解説してきました。
jsonファイルは実際の現場でもよく見る形式ですので、これを機にjsonを思いのまま操れるようになっておきましょう!それでは!!