はじめに
JSON(JavaScript オブジェクト表記法)は、直列化され人間が読みやすい形式でデータを保存するための人気のあるデータ形式です。一般的にサーバーと Web アプリケーションの間でデータを送信するために使用され、NoSQL データベースにデータを保存するための素晴らしい選択肢でもあります。Python では、jsonモジュールを使用して JSON データを操作できます。
成果
- JSON ファイルの読み書き
- JSON データのシリアル化と逆シリアル化
JSON の紹介
JSON(JavaScript オブジェクト表記法)は、人間が読み書きしやすく、機械が解析し生成しやすい軽量のデータ交換形式です。JavaScript 言語のサブセットに基づいており、Standard ECMA-262 3rd Edition - December 1999 に準拠しています。JSON は完全に言語非依存のテキスト形式ですが、C 言語ファミリーの言語(C、C++、C#、Java、JavaScript、Perl、Python など)のプログラマーにとって馴染みのある規約を使用しています。これらの特性により、JSON は理想的なデータ交換言語になっています。
JSON の基本構造は、キーと値のペアのコレクションであるオブジェクトと、値の順序付きリストである配列で構成されています。
以下は JSON オブジェクトの例です:
{
"name": "Alice",
"age": 26,
"city": "New York"
}
この JSON オブジェクトには 3 つのキーと値のペアがあります:
- "name" : "Alice"
- "age" : 26
- "city" : "New York"
以下は JSON 配列の例です:
["apple", "banana", "cherry"]
この JSON 配列には 3 つの値があります:"apple"、"banana"、および"cherry"。
JSON オブジェクトには複数のキーと値のペアと配列を含めることができ、JSON 配列には複数のオブジェクトと配列を含めることができます。以下はより複雑な JSON 構造の例です:
{
"employees": [
{ "firstName": "John", "lastName": "Doe" },
{ "firstName": "Anna", "lastName": "Smith" },
{ "firstName": "Peter", "lastName": "Jones" }
],
"owners": [
{ "name": "Alice", "age": 30 },
{ "name": "Bob", "age": 35 }
],
"office": {
"name": "Acme Inc.",
"location": "New York"
}
}
この JSON オブジェクトには 3 つのキーと値のペアがあります:
- "employees" : 従業員オブジェクトの配列
- "owners" : オーナーオブジェクトの配列
- "office" : オフィスオブジェクト
Json モジュール
Python で JSON オブジェクトを解析するには、json モジュールを使用できます。json モジュールは Python 標準ライブラリの一部であるため、別途インストールする必要はありません。
新しい Python インタプリタセッションを開き、次のコードを入力します:
python3
前の例の JSON オブジェクトを解析する方法の例を次に示します:
import json
json_strings = '{"employees": [{ "firstName": "John", "lastName": "Doe"}, ], "owners": [{ "name": "Alice", "age": 30 }, { "name": "Bob", "age": 35 }], "office": {"name": "Acme Inc."}}'
## JSON オブジェクトを解析する
data = json.loads(json_strings)
## データにアクセスする
employees = data['employees']
owners = data['owners']
office = data['office']
## データを表示する
print(employees)
print(owners)
print(office)
これにより、次のような出力が表示されます:
[{'firstName': 'John', 'lastName': 'Doe'}]
[{'name': 'Alice', 'age': 30}, { "name": "Bob", "age": 35 }]
{'name': 'Acme Inc.'}
その後、Python の辞書やリストと同じように、キーとインデックスを使って JSON オブジェクト内のデータにアクセスできます。たとえば、最初の従業員の名前にアクセスするには、次のコードを使用できます:
first_employee = employees[0]
first_name = first_employee['firstName']
print(first_name)
これにより、次のような出力が表示されます:
John
また、配列をループして各要素のデータにアクセスすることもできます。たとえば、各オーナーの名前と年齢を表示するには、次のコードを使用できます:
for owner in owners:
name = owner['name']
age = owner['age']
print(f'{name} is {age} years old.')
これにより、次のような出力が表示されます:
Alice is 30 years old.
Bob is 35 years old.
JSON ファイルの読み取り
まずは JSON ファイルを読み込んでみましょう。次の内容を持つemployees.jsonファイルがあるとします:
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}
employees.jsonは/home/labex/projectに存在しています。
Python でこのファイルを読み込むには、次のコードを使用できます:
import json
## ファイルを開く
with open('/home/labex/project/employees.json', 'r') as file:
## ファイルの内容を変数に読み込む
data = json.load(file)
## ファイルの内容を表示する
print(data)
これにより、次のような出力が表示されます:
{'employees': [{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]}
JSON オブジェクトのキーを使って、ファイル内のデータにアクセスできます。Python の辞書と同じようにです。たとえば、従業員のリストにアクセスするには、employeesキーを使います:
employees = data['employees']
print(employees)
これにより、次のような出力が表示されます:
[{'firstName': 'John', 'lastName': 'Doe'}, {'firstName': 'Anna', 'lastName': 'Smith'}, {'firstName': 'Peter', 'lastName': 'Jones'}]
また、従業員のリストをループして彼らの名前を表示することもできます:
for employee in employees:
print(employee['firstName'], employee['lastName'])
これにより、次のような出力が表示されます:
John Doe
Anna Smith
Peter Jones
JSON ファイルの書き込み
JSON ファイルを読む方法を知ったので、書き込む方法を学んでみましょう。JSON ファイルにデータを書き込むには、json.dump()関数を使用できます。
学生に関する情報を含む辞書のリストがあるとします。このデータをstudents.jsonという名前のファイルに書き込むことができます。
import json
## 辞書のリスト
students = [
{ "name": "Alice", "age": 26, "major": "Computer Science" },
{ "name": "Bob", "age": 27, "major": "Economics" },
{ "name": "Charlie", "age": 25, "major": "Physics" }
]
## ファイルを開く
with open('students.json', 'w') as file:
## データをファイルに書き込む
json.dump(students, file)
では、データが正しく書き込まれたことを確認しましょう。
with open('students.json', 'r') as file:
data = json.load(file)
print(data)
これにより、次のような出力が表示されます。
[
{ "name": "Alice", "age": 26, "major": "Computer Science" },
{ "name": "Bob", "age": 27, "major": "Economics" },
{ "name": "Charlie", "age": 25, "major": "Physics" }
]
また、Python オブジェクトを JSON 文字列に変換するには、json.dumps()関数を使用することもできます。これをファイルに保存したり、ネットワークを介して送信したりすることができます。例を示します。
## 辞書のリストを JSON 文字列に変換する
json_string = json.dumps(students)
print(json_string)
## 文字列をファイルに保存する
with open('students.json', 'w') as file:
file.write(json_string)
## では、データが正しく書き込まれたことを確認しましょう
with open('students.json', 'r') as file:
data = json.load(file)
print(data)
これは前の例と同じ出力になります。
Python オブジェクトと JSON 文字列
Python オブジェクトは、メモリに格納されるリスト、辞書などの形式のデータのコレクションです。一方、JSON 文字列は JSON オブジェクトの直列化された表現です。JSON オブジェクト内のデータを表す文字の文字列ですが、実際のオブジェクトとしてメモリに格納されていません。
students.jsonの内容を読み取るためにread()関数を使用する方法の例を以下に示します。
with open('students.json', 'r') as file:
json_string = file.read()
print(json_string)
これにより、次のような出力が表示されます。
[{"name": "Alice", "age": 26, "major": "Computer Science"}, {"name": "Bob", "age": 27, "major": "Economics"}, {"name": "Charlie", "age": 25, "major": "Physics"}]
json_stringの最初の要素を取得しようとすると、文字列の最初の文字が取得されます。
print(json_string[0])
[
これは、json_stringが文字列であり、リスト(Python オブジェクト)ではないためです。リストに変換するには、json.loads()関数を使用できます。
import json
## JSON 文字列を Python オブジェクトに変換する
python_object = json.loads(json_string)
print(python_object)
出力は上記と同様で、シングルクォートとダブルクォートの違いがあります。
[{'name': 'Alice', 'age': 26,'major': 'Computer Science'}, {'name': 'Bob', 'age': 27,'major': 'Economics'}, {'name': 'Charlie', 'age': 25,'major': 'Physics'}]
これで、リストの最初の要素にアクセスできます。
print(python_object[0])
{ "name": "Alice", "age": 26, "major": "Computer Science" }
初心者はしばしば Python オブジェクトと JSON 文字列を混同してしまうので、特に注意してください。
まとめ
おめでとうございます!JSON ファイルに関する実験を完了しました。Python で JSON ファイルを読み書きする方法を学びました。また、Python で JSON データを扱う方法も学びました。



