pyてよn日記

一寸先は闇が人生

Python:JSONファイルの扱い

目次

概要

 JSONの基礎を簡単に解説。Pythonの標準モジュールjsonを用いたJSONファイルの基本的な扱い方をまとめた。

注意

 JSONファイルのイメージを噛み砕いて書いてあるため、厳密には間違っている部分があるかもしれません。正しい情報(仕様など)を見たい方は、json.orgの日本語ドキュメントを参照してください。


JSONとは?

 JavaScriptのオブジェクトの記法をベースに作られた軽量なデータフォーマット。人間にも機械にも扱いやすいフォーマットになっている。
 難しく考えることは無く、特定の記法(後述)で書かれたテキストファイルをJSONファイルと呼んで、.jsonという拡張子をつけて管理しましょうということ。APIやアプリケーションでリクエストのレスポンスとして使われることが多い。

JavaScriptのオブジェクト

 JavaScriptのオブジェクトは、Pythonの辞書型と似ていて、それぞれの値に名前をつけて管理するデータ型である。{key: value}と書いて定義する。以下にいくつか例を示す。

// 基本的なオブジェクト
var obj1 = {foo: 1, bar: 2}

// リストを値にもつオブジェクト
var obj2 = {
    foo: [1, 2, 3, 4], 
    bar: [5, 6, 7, 8], 
    fav: "math"
}

// オブジェクトを値にもつオブジェクト
var fruits = {
    apple: {ja: "りんご", color: "red", num: 3}, 
    banana: {ja: "バナナ", color: "yellow", num: 4}, 
    grape: {ja: "ぶどう", color: "purple, num: 10"}
}

 以上のように、値と名前を関連づけてデータを管理できるようになっている。この表記法をベースにしたデータフォーマットがJSONである。ユーザネーム、ユーザIDなどのユーザ情報を一元管理するのとかに便利そうっすよね。

JavaScriptのオブジェクトでは、keyの部分はダブルクオーテーションマークを省略することができるが、JSONファイルの中ではkey部分は必ずダブルクオーテーションでくくらないといけないため注意。

JSONファイルを見てみる

 実際にJSONファイルを中身を見てみる。配列(リスト)をそのままJSONファイルに書くこともできる。ほとんどの場合はオブジェクトで書いてあるはず。

JSONとはの記事からデータ例を引用
example.json

// 配列リテラルも一応JSONファイル内に書ける
["one", "two", "three"]

//オブジェクト(基本これ)
{
  "name": "hogeta",
  "age": "12",
  "address": "shibuya",
  "result": true
}

//配列とオブジェクトの組み合わせ
{
  "a": {
    "name": "a",
    "id": 1,
    "result": false
  },
  "b": {
    "name": "b",
    "id": 2,
    "result": true
  },
  "c": {
    "name": "c",
    "id": 3,
    "result": true
  }
}

 JavaScriptの場合は、変数の定義のためvar 変数名と書いてあったが、JSONファイル中はそういったものは必要ない。ファイルの中身は、ただオブジェクトをならべて書いてあるだけである。


Pythonjsonモジュール

 ここからはPythonJSONを扱う方法を解説する。
環境

jsonモジュールの関数まとめ

 基本的に、引数を特定の型に変換する関数である。json.dump()だけ処理の種類が異なるため注意。

関数 処理
json.load(f_obj) JSONのファイルオブジェクト --> 辞書型
json.loads(json_str) JSON形式の文字列 --> 辞書型
json.dumps(dict) 辞書型 --> JSON形式の文字列
json.dump(dict, f_obj) 辞書型変数を、JSONファイルとして書き込み
  • f_obj: ファイルオブジェクト
  • json_str: json形式の文字列(str型)
  • dict: 辞書型(dict型)

実際にやってみた

辞書型を作成してJSONファイルを作成

 まずはPythonの辞書型をJSONファイルとして保存する方法を紹介。

実行結果

$ python dict2json.py
$ cat output/top_cities_dic.json
{"1": {"rank": 1, "city": "\u4e0a\u6d77", "population": 24150000}, "2": {"rank": 2, "city": "\u30ab\u30e9\u30c1", "population": 23500000}, "3": {"rank": 3, "city": "\u5317\u4eac", "population": 21516000}, "4": {"rank": 4, "city": "\u5929\u6d25", "population": 14722100}, "5": {"rank": 5, "city": "\u30a4\u30b9\u30bf\u30f3\u30d6\u30eb", "population": 14160467}}

 こんな感じでPythonの辞書型変数がJSONファイルに書き込まれていることが確認できる。文字コードの関係で、日本語は、非ASCII文字を\uでエスケープした状態で表示されている。
 文字コードと、Pythonでの\uの扱いは以下の記事を参照。日本語を扱ったJSONファイルを扱う時に出てくるため分からない方は確認して見てください。

 ちなみに、作成したJSONファイルを整形した表示にするとこんな感じ。

top_cities_dict.json

{
    "1": {"rank": 1, "city": "\u4e0a\u6d77", "population": 24150000},
    "2": {"rank": 2, "city": "\u30ab\u30e9\u30c1", "population": 23500000},
    "3": {"rank": 3, "city": "\u5317\u4eac", "population": 21516000},
    "4": {"rank": 4, "city": "\u5929\u6d25", "population": 14722100},
    "5": {"rank": 5, "city": "\u30a4\u30b9\u30bf\u30f3\u30d6\u30eb", "population": 14160467}
}

JSONファイルを読み込んで、辞書型に変換

 先ほど作ったJSONファイルを読み込んで、Python辞書型として取り出してみる。取り出した辞書型から、要素をキーで取り出すまでを行なっている。

実行結果

$ python load_json_to_dict.py
{'rank': 1, 'city': '上海', 'population': 24150000}
{'rank': 2, 'city': 'カラチ', 'population': 23500000}
{'rank': 3, 'city': '北京', 'population': 21516000}
{'rank': 4, 'city': '天津', 'population': 14722100}
{'rank': 5, 'city': 'イスタンブル', 'population': 14160467}

 ちゃんと辞書型変数 dict から要素を取り出せている。


終わりに

 最後まで見てくださりありがとうございます。JSONの基本的な解説と、PythonでのJSONファイルの取り扱いについてまとめてみました。
 JSONファイルをちゃんと扱えるようになるにはAPIとか使って慣れるしかないですね。早く"〇〇を分析して見た"系の記事を書けるように精進していきます。記事中の間違い・内容に関してのご指摘等ありましたらコメントしていただけると幸いです。

参考記事

以下の記事を参考にさせていただきました。