はじめに
Python は強力なプログラミング言語ですが、経験豊富な開発者でさえ、開発中にエラーに遭遇することがあります。初心者がよく直面する一般的なエラーの 1 つは、JSON データを扱おうとしたときに発生する NameError: name 'json' is not defined です。このチュートリアルでは、このエラーを理解し、再現し、解決するためのガイドを提供し、Python コードがスムーズに実行されるようにします。
この実験(Lab)の終わりには、このエラーが発生する理由を理解し、Python アプリケーションで JSON モジュールを正しくインポートして使用する方法を学ぶことができます。
Python NameError の理解
Python での NameError は、インタプリタが使用しようとしている変数、関数、またはモジュールを見つけられない場合に発生します。このエラーは、通常、次のいずれかの原因が考えられます。
- 変数を定義する前に使用している
- 変数名または関数名を誤って記述している
- モジュールを使用する前にインポートし忘れている
簡単な NameError の例を探る
NameError を生成する簡単なスクリプトを作成することから始めましょう。コードエディタを開き、/home/labex/project ディレクトリに name_error_example.py という名前の新しいファイルを作成し、次の内容を記述します。
## This script demonstrates a simple NameError
print("Starting the script...")
## Try to use a variable that hasn't been defined
print(undefined_variable)
print("This line won't execute because of the error above")
次に、このスクリプトを実行してみましょう。ターミナルを開き、以下を実行します。
python3 /home/labex/project/name_error_example.py
次のような出力が表示されるはずです。
Starting the script...
Traceback (most recent call last):
File "/home/labex/project/name_error_example.py", line 5, in <module>
print(undefined_variable)
NameError: name 'undefined_variable' is not defined
このエラーメッセージは、次のことを示しています。
- エラーの種類:
NameError - 具体的な問題:
name 'undefined_variable' is not defined - 場所:スクリプトの 5 行目
Python インタプリタは、最初に定義せずに undefined_variable という変数を使用しようとしたため、このエラーを発生させました。これは、json モジュールをインポートせずに使用しようとしたときに発生するエラーと同じ種類です。
JSON NameError の再現
NameError が何かを理解したので、タイトルで言及されている特定のエラー、NameError: name 'json' is not defined を再現してみましょう。
JSON エラーを含むスクリプトの作成
/home/labex/project ディレクトリに json_error.py という名前の新しいファイルを作成し、次の内容を記述します。
## This script tries to use the json module without importing it
## Sample JSON string
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'
## Try to parse JSON without importing the json module
parsed_data = json.loads(json_string)
print("User data:", parsed_data)
このスクリプトでは、json.loads() 関数を使用して JSON 文字列を解析しようとしていますが、最初に json モジュールをインポートしていません。
スクリプトを実行して、何が起こるか見てみましょう。
python3 /home/labex/project/json_error.py
次のようなエラーメッセージが表示されるはずです。
Traceback (most recent call last):
File "/home/labex/project/json_error.py", line 7, in <module>
parsed_data = json.loads(json_string)
NameError: name 'json' is not defined
これは、この実験(Lab)で解決しようとしているまさにそのエラーです!Python インタプリタは、使用する前に json モジュールをインポートしなかったため、json モジュールを見つけることができません。
JSON モジュールの理解
エラーを修正する前に、JSON モジュールが何であるかを理解しましょう。
- JSON (JavaScript Object Notation) は、軽量なデータ交換形式です。
- Python には、JSON データを扱うための組み込み
jsonモジュールが含まれています。 jsonモジュールは、Python オブジェクトを JSON 文字列としてエンコードし、JSON 文字列を Python オブジェクトにデコードするためのメソッドを提供します。- 一般的な関数には、
json.dumps()(Python を JSON に変換) とjson.loads()(JSON を Python に変換) があります。
すべての Python モジュールと同様に、その関数を使用する前に json モジュールをインポートする必要があります。
JSON NameError の修正
エラーを再現したので、JSON モジュールを適切にインポートして修正しましょう。
インポート文の追加
json_error.py ファイルを開き、先頭にインポート文を追加して更新します。
## This script properly uses the json module by importing it first
import json
## Sample JSON string
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'
## Parse JSON after importing the json module
parsed_data = json.loads(json_string)
print("User data:", parsed_data)
重要な変更点は、ファイルの先頭に import json を追加したことです。これにより、Python は JSON モジュールを使用する前にロードするように指示されます。
修正されたスクリプトの実行
ファイルを保存して、もう一度実行します。
python3 /home/labex/project/json_error.py
今回は、次のような出力でスクリプトが正常に実行されるはずです。
User data: {'name': 'Alice', 'age': 30, 'city': 'New York'}
json モジュールを適切に使用する前にインポートしたため、スクリプトはエラーなしで実行されるようになりました。
代替インポート方法
Python でモジュールをインポートする方法はいくつかあります。
モジュール全体をインポートする(上記のように):
import json ## Use as json.function_name()モジュールから特定の関数をインポートする:
from json import loads ## Use directly as loads()エイリアスを使用してインポートする:
import json as j ## Use as j.function_name()
2 番目の方法を試してみましょう。 json_import_variation.py という名前の新しいファイルを作成し、以下を記述します。
## Importing specific functions from the json module
from json import loads
## Sample JSON string
json_string = '{"name": "Bob", "age": 25, "city": "San Francisco"}'
## Parse JSON using the directly imported function
parsed_data = loads(json_string)
print("User data:", parsed_data)
このスクリプトを実行して、これも動作することを確認します。
python3 /home/labex/project/json_import_variation.py
次のように表示されるはずです。
User data: {'name': 'Bob', 'age': 25, 'city': 'San Francisco'}
これは、NameError を防ぐことができる JSON モジュールをインポートする有効な方法が複数あることを示しています。
JSON データの操作
JSON モジュールを適切にインポートする方法がわかったので、一般的な JSON 操作にどのように使用するかを見ていきましょう。
完全な JSON 例の作成
json_operations.py という名前の新しいファイルを作成し、次の内容を記述します。
## Complete example of working with JSON in Python
import json
## 1. Converting Python object to JSON string (serialization)
user = {
"name": "Charlie",
"age": 28,
"is_student": False,
"courses": ["Python", "Data Science", "Web Development"],
"address": {
"street": "123 Tech Lane",
"city": "Boston",
"zipcode": "02101"
}
}
## Convert Python dictionary to JSON string
json_string = json.dumps(user, indent=2)
print("JSON string created from Python object:")
print(json_string)
print("\n" + "-"*50 + "\n")
## 2. Parse JSON string to Python object (deserialization)
parsed_user = json.loads(json_string)
print("Python object created from JSON string:")
print("Name:", parsed_user["name"])
print("Age:", parsed_user["age"])
print("Courses:", parsed_user["courses"])
print("City:", parsed_user["address"]["city"])
print("\n" + "-"*50 + "\n")
## 3. Writing JSON to a file
with open("/home/labex/project/user_data.json", "w") as json_file:
json.dump(user, json_file, indent=2)
print("JSON data written to user_data.json")
## 4. Reading JSON from a file
with open("/home/labex/project/user_data.json", "r") as json_file:
loaded_user = json.load(json_file)
print("JSON data loaded from file. User name:", loaded_user["name"])
このスクリプトは、4 つの一般的な JSON 操作を示しています。
json.dumps()を使用して Python オブジェクトを JSON 文字列に変換するjson.loads()を使用して JSON 文字列を Python オブジェクトに解析するjson.dump()を使用して JSON データをファイルに書き込むjson.load()を使用してファイルから JSON データを読み込む
スクリプトを実行します。
python3 /home/labex/project/json_operations.py
次のような出力が表示されるはずです。
JSON string created from Python object:
{
"name": "Charlie",
"age": 28,
"is_student": false,
"courses": [
"Python",
"Data Science",
"Web Development"
],
"address": {
"street": "123 Tech Lane",
"city": "Boston",
"zipcode": "02101"
}
}
--------------------------------------------------
Python object created from JSON string:
Name: Charlie
Age: 28
Courses: ['Python', 'Data Science', 'Web Development']
City: Boston
--------------------------------------------------
JSON data written to user_data.json
JSON data loaded from file. User name: Charlie
このスクリプトは、user_data.json という名前のファイルも作成しました。その内容を見てみましょう。
cat /home/labex/project/user_data.json
適切なインデントでフォーマットされた JSON データが表示されるはずです。
{
"name": "Charlie",
"age": 28,
"is_student": false,
"courses": ["Python", "Data Science", "Web Development"],
"address": {
"street": "123 Tech Lane",
"city": "Boston",
"zipcode": "02101"
}
}
これで、モジュールを適切にインポートすることにより、NameError: name 'json' is not defined エラーを回避する方法を含め、Python で JSON データを操作する方法を正常に学習しました。
まとめ
この実験では、以下のことを学びました。
- Python における
NameErrorとは何か、そしてこの例外の一般的な原因 - 特定のエラー
NameError: name 'json' is not definedを特定し、トラブルシューティングする方法 - さまざまなインポート構文オプションを使用して JSON モジュールを適切にインポートする方法
- Python での JSON データの操作方法。これには以下が含まれます。
- Python オブジェクトを JSON 文字列に変換する
- JSON 文字列を Python オブジェクトに解析する
- JSON データをファイルに書き込む
- ファイルから JSON データを読み込む
これらのスキルは、Python でデータを扱う上で不可欠であり、特に Web サービスと通信したり、設定データを保存したりするアプリケーションを構築する際に役立ちます。モジュールを適切にインポートして使用する方法を理解することで、一般的なエラーを回避し、より堅牢な Python コードを作成できます。
このパターンは、JSON モジュールだけでなく、すべての Python モジュールに適用されることを覚えておいてください。外部の機能を使用する前に、常にファイルの先頭に適切なインポート文があることを確認してください。



