Python で 'NameError: name 'json' is not defined' を解決する方法

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

はじめに

Python は強力なプログラミング言語ですが、経験豊富な開発者でさえ、開発中にエラーに遭遇することがあります。初心者がよく直面する一般的なエラーの 1 つは、JSON データを扱おうとしたときに発生する NameError: name 'json' is not defined です。このチュートリアルでは、このエラーを理解し、再現し、解決するためのガイドを提供し、Python コードがスムーズに実行されるようにします。

この実験(Lab)の終わりには、このエラーが発生する理由を理解し、Python アプリケーションで JSON モジュールを正しくインポートして使用する方法を学ぶことができます。

Python NameError の理解

Python での NameError は、インタプリタが使用しようとしている変数、関数、またはモジュールを見つけられない場合に発生します。このエラーは、通常、次のいずれかの原因が考えられます。

  1. 変数を定義する前に使用している
  2. 変数名または関数名を誤って記述している
  3. モジュールを使用する前にインポートし忘れている

簡単な 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 でモジュールをインポートする方法はいくつかあります。

  1. モジュール全体をインポートする(上記のように):

    import json
    ## Use as json.function_name()
  2. モジュールから特定の関数をインポートする:

    from json import loads
    ## Use directly as loads()
  3. エイリアスを使用してインポートする:

    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 操作を示しています。

  1. json.dumps() を使用して Python オブジェクトを JSON 文字列に変換する
  2. json.loads() を使用して JSON 文字列を Python オブジェクトに解析する
  3. json.dump() を使用して JSON データをファイルに書き込む
  4. 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 モジュールに適用されることを覚えておいてください。外部の機能を使用する前に、常にファイルの先頭に適切なインポート文があることを確認してください。