JSON データの解析

PythonBeginner
オンラインで実践に進む

はじめに

JSON(JavaScript Object Notation)は、設定ファイルや API 通信で広く使われている軽量なデータ交換形式です。

シェルツールはプレーンテキストの処理には適していますが、JSON のような構造化形式は、通常、Python の組み込みライブラリを使って操作するほうが簡単で安全です。

この実験では、アプリケーションの設定を更新する開発者として作業します。JSON 設定ファイルを作成し、それを読み込む Python スクリプトを記述して設定を変更し、変更内容を新しいファイルに保存します。

サンプルデータを作成する

このステップでは、サンプルの JSON 設定ファイルを作成します。このファイルは、アプリケーション名、バージョン、デバッグモード、接続数の上限をキーとして持つ、一般的なソフトウェアアプリケーションの設定ファイルを再現したものです。

まず、正しい作業ディレクトリにいることを確認します。

JSON は、現代の運用で最も一般的な構造化データ形式の 1 つです。API、クラウドツール、多くの設定システムで使われているためです。JSON をプレーンテキストとして扱うのではなく、安全に読み取り、変更する方法を学ぶことは、非常に重要です。

cd ~/project

次に、nano などのテキストエディターを使って、config.json というファイルを作成します。

nano config.json

次の内容をファイルに貼り付けます。この JSON オブジェクトには、ブール値(false)、整数(100)、文字列が含まれています。

{
  "appName": "SuperApp",
  "version": "1.0.0",
  "debug": false,
  "maxConnections": 100
}

nano で保存して終了するには、次の操作を行います。

変更内容を書き込むために Ctrl + O を押し、続けて Enter を押してファイル名を確定します。その後、Ctrl + X を押してエディターを終了します。

cat コマンドを使って、ファイルの内容を確認できます。

cat config.json

JSON の内容がターミナルに表示されれば成功です。

JSON を読み取る

このステップでは、config.json ファイルを読み取る Python スクリプトを作成します。Python の json モジュールは、JSON データを Python の辞書に変換します。

ここで、Python は基本的なシェルスクリプトより明確な利点を持ちます。正規表現でテキストを検索し、構造が単純なままであることを期待する代わりに、Python は JSON のルールに従ってファイルを解析し、実際のデータ型として扱えるデータを提供します。

json.load() は、配送用の箱を「開梱する」処理だと考えてください。ファイルに保存されたテキスト(箱)を受け取り、コードから簡単に利用・変更できる Python の辞書(中身)に変換します。

parse_json.py という新しい Python スクリプトを作成します。

nano parse_json.py

次のコードをファイルに追加します。このスクリプトは、json モジュールをインポートし、設定ファイルを開いてデータを読み込みます。

import json

## Open the JSON file
with open('config.json', 'r') as file:
    ## Load the data into a Python dictionary
    data = json.load(file)

## Print the data to verify it was loaded correctly
print("Current Configuration:")
print(data)
print(f"Type of data: {type(data)}")

nano を保存して終了します(Ctrl+O、Enter、Ctrl+X)。

次に、スクリプトを実行して出力を確認します。

python3 parse_json.py

コンソールに辞書が表示されれば、Python が JSON ファイルを正常に解析できたことを確認できます。

データを変更する

このステップでは、Python スクリプト内で読み込んだデータを変更します。json.load() はデータを標準的な Python の辞書に変換するため、ほかの辞書と同じように値を変更できます。

ここでは、データ型の変換も確認できます。JSON の true と false は、Python の True と False に変換されます。数値は単なる文字列ではなく、数値のまま保持されます。そのため、後続の比較や計算をより安全に行えます。

もう一度 parse_json.py を開いて編集します。

nano parse_json.py

debug キーの値を、JSON の false に対応する False から True に変更します。データを読み込んだ後、表示する前に変更処理を追加してください。

コードを次のように更新します。

import json

with open('config.json', 'r') as file:
    data = json.load(file)

print("Original Debug Status:", data['debug'])

## Modify the value
data['debug'] = True

print("Updated Debug Status:", data['debug'])

nano を保存して終了します。

もう一度スクリプトを実行し、メモリ上の変更を確認します。

python3 parse_json.py

出力に、元の状態が False、更新後の状態が True と表示されれば成功です。ただし、この変更は現在 Python プログラムのメモリ上に存在するだけで、まだファイルには保存されていません。

変更を保存する

このステップでは、変更した辞書を新しい JSON ファイルに保存します。保存には json.dump() 関数を使用します。

この「読み取り、変更、書き込み」のサイクルは、自動化で非常によく使われるパターンです。スクリプトで構造化データを読み込み、意図したフィールドだけを変更し、有効な JSON として書き出します。ファイル構造が複雑になった場合、行単位で編集するよりもはるかに信頼性が高い方法です。

json.dump() は、箱を「梱包する」処理だと考えてください。Python の辞書(中身)をテキスト形式(封をした箱)に戻し、ファイルに保存できるようにします。テスト中に元の設定を上書きしないよう、new_config.json などの新しいファイルに保存するのがよい方法です。

最後にもう一度 parse_json.py を開きます。

nano parse_json.py

data 辞書を new_config.json というファイルに書き込むコードを追加します。indent=4 パラメーターを使用して、出力ファイルを人間が読みやすい形式(pretty-printed)にします。

完成したスクリプトは次のようになります。

import json

## 1. Read the original file
with open('config.json', 'r') as file:
    data = json.load(file)

## 2. Modify the data
data['debug'] = True

## 3. Write to a new file
with open('new_config.json', 'w') as file:
    json.dump(data, file, indent=4)

print("Configuration updated and saved to new_config.json")

nano を保存して終了します。

スクリプトを実行して、読み取り、変更、書き込みの処理を行います。

python3 parse_json.py

成功すると、スクリプトに確認メッセージが表示されます。

結果を確認する

このステップでは、新しい設定ファイルが作成され、更新された値が含まれていることを確認します。

構造化ファイルでは、構文上はスクリプトが成功していても、論理的には誤った内容が生成される可能性があります。そのため、結果を読み戻して、ファイルが作成されたこととデータが正しく変更されたことの両方を確認することが重要です。

ディレクトリ内のファイルを一覧表示し、new_config.json が存在することを確認します。

ls -l

次に、新しいファイルの内容を表示します。

cat new_config.json

次のような出力が表示されます。

{
  "appName": "SuperApp",
  "version": "1.0.0",
  "debug": true,
  "maxConnections": 100
}

"debug" が true になっていることを確認してください。

diff コマンドを使って元のファイルと新しいファイルを比較し、正確な変更箇所を確認することもできます。

diff config.json new_config.json

出力には、debug 行の違いが示されます。

まとめ

この実験では、Python を使って JSON データを扱う方法を学びました。まず、JSON の設定ファイルを作成し、そのファイルを辞書に解析する Python スクリプトを記述しました。次に、プログラムからデータを変更し、更新した構造を新しい JSON ファイルに保存しました。

この「読み取り、変更、書き込み」という流れは、自動化や DevOps のスクリプトで基本となるパターンです。Bash はコマンドの実行に適していますが、Python は JSON のような構造化データを扱えるため、複雑な設定や API データを管理する強力なツールになります。