Pythonでのjsonファイルの読み込みモジュールの比較

## はじめに
テキストファイルの読み込みモジュールについて「[Pythonのテキストファイル読み込みモジュールの比較](https://qiita.com/yasthon/items/360bee5af65fc6eb1069)」を書きました。
jsonファイルの読み込みモジュールも同様で、使用するたびに調べていたので、
同様に書き残します。

## 環境

- OS    ：CentOS Linux release 7.6.1810 (Core)
- Python：Python 3.7.5

参考
[json --- json エンコーダおよびデコーダ](https://docs.python.org/ja/3/library/json.html?highlight=json)


## 4つのモジュール

Pythonでjsonを扱うときに使用されるモジュールは、下記の4つです。

| モジュール名 | 説明 |
|:--|:--|
| json.load()  | jsonファイルを読み込み、dict型にする（引数は、ファイルオブジェクト）
| json.loads() | jsonテキスト（str型）をdict型にする（引数は、str型）
| json.dump()  | dict型をjsonファイルに保存する（引数は、ファイルオブジェクトとdict型）
| json.dumps() | dict型をstr型のjsonに整形する（引数は、dict型）


## テスト用のファイル

下記ファイルを読み込み用として作成します。

```json:file.json
{
  "aaa": "1111",
  "bbb": "2222",
  "ccc": {
    "ddd": "333",
    "eee": "444",
    "fff": "555"
  }
}
```

## json.load()のテストコード

jsonファイルを読み込むテストコードです。

```python:testload.py
#!/usr/bin/env python

import json

FILENAME="file.json"

fd = open(FILENAME, mode='r')
data = json.load(fd)
fd.close()
print("date : ", type(data))
print(data)
```

実行して、結果を表示します。

```shell
$ ./testload.py
date : <class 'dict'>
{'aaa': '1111', 'bbb': '2222', 'ccc': {'ddd': '333', 'eee': '444', 'fff': '555'}}
```

ファイルを読み込んでdict型になっています。


## json.loads() テストコード

str型変数のjsonテキストを読み込みむテストコードです。

```python:testlocads.py
#!/usr/bin/env python

import json

WORD='{"aaa": "1111", "bbb": "2222", "ccc": { "ddd": "333", "eee": "444", "fff": "555" }}'

print("WORD : ", type(WORD))
data = json.loads(WORD)
print("data : ", type(data))
print(data)
```

実行して、結果を表示します。

```shell
$ ./testlocads.py
WORD : <class 'str'>
data : <class 'dict'>
{'aaa': '1111', 'bbb': '2222', 'ccc': {'ddd': '333', 'eee': '444', 'fff': '555'}}
```

str型のjson（WORD変数）を読み込んで、dict型（data変数）に格納しています。


## json.dump()のテストコード

dict型変数のjsonテキストをファイルに保存するテストコードです。

```python:testdump.py
#!/usr/bin/env python

import json

FILENAME="file_write.json"
WORD='{"aaa": "1111", "bbb": "2222", "ccc": { "ddd": "333", "eee": "444", "fff": "555" }}'

print("WORD : ", type(WORD))
fd = open(FILENAME, mode='w')
json.dump(WORD, fd)
fd.close()
```

実行して、結果を表示します。

```shell
$ ./testdump.py
WORD :  <class 'str'>

$ cat file_write.json
"{\"aaa\": \"1111\", \"bbb\": \"2222\", \"ccc\": { \"ddd\": \"333\", \"eee\": \"444\", \"fff\": \"555\" }}"
```

str型のjson（WORD変数）を読み込んで、ファイルに書き込んでいます。


## json.dumps()のテストコード

```python:testdumps.py
#!/usr/bin/env python

import json

WORD={"aaa": "1111", "bbb": "2222", "ccc": { "ddd": "333", "eee": "444", "fff": "555" }}

print("WORD : ", type(WORD))
data = json.dumps(WORD)
print(type(data))
print(data)
```


実行して、結果を表示します。

```shell
$ ./testdumps.py
WORD :  <class 'dict'>
<class 'str'>
{"aaa": "1111", "bbb": "2222", "ccc": {"ddd": "333", "eee": "444", "fff": "555"}}
```

dict型（data変数）を読み込んで、str型のjson（WORD変数）に格納しています。

## ファイルの内容を表示したいだけのとき

jsonのファイルを表示したいだけなら、次のコマンドで可能です。

```shell
$ python -m json.tool file.json
```

実行すると、このように整形されて表示されます。

```
{
    "aaa": "1111",
    "bbb": "2222",
    "ccc": {
        "ddd": "333",
        "eee": "444",
        "fff": "555"
    }
}
```

## 最後に

下記の表の内容を理解していなかっただけです。

| 扱う対象| jsonファイル| jsonのstr型 |
|:--------------------------|:------------------|:------------------|
| dict型を出力  | ファイルを入力 : json.load() | str型を入力 : json.loads() |
| dict型を入力  | ファイルを出力 : json.dump() | str型を出力 : json.dumps() |

documentを読んだだけでは、理解できていなかったです。
この記事を書くために調べながらテストして、分かったような気がします。
アウトプットって大切です。