Pythonで文字列が有効なJSONかどうかを判定する方法
JSON(JavaScript Object Notation)は、異なるプログラムやシステム間でデータを簡単にやり取りするために広く利用されているテキスト形式です。JSONには明確に定められた書式ルールがあり、その形式が正しいかどうかはPythonの標準ライブラリで検証できます。本記事では、ある文字列が有効なJSON形式を表しているかどうかを、jsonモジュールを使って判定する方法を解説します。
json.loads() によるJSONの検証
jsonモジュールには、JSON文字列を読み込んでPythonオブジェクト(辞書など)に変換する loads() メソッドが用意されています。検証したい文字列を loads() に渡し、処理全体を try-except ブロックで囲むのが基本的な手法です。読み込み時にエラーが発生しなければ「有効なJSON」、ValueError が発生すれば「無効なJSON」と判断できます。
サンプルコード
import json
# パターン1:正しいJSON文字列
a_string = '{"Mon": "2pm", "Wed": "9pm", "Fri": "6pm"}'
print("検証対象の文字列:", a_string)
try:
json_obj = json.loads(a_string)
print("→ 有効なJSONです")
except ValueError as e:
print("→ 無効なJSONです")
# パターン2:値が引用符で囲まれていない不正なJSON文字列
a_string = '{"Mon": 2pm, "Wed": "9pm", "Fri": "6pm"}'
print("検証対象の文字列:", a_string)
try:
json_obj = json.loads(a_string)
print("→ 有効なJSONです")
except ValueError as e:
print("→ 無効なJSONです")
# パターン3:ネスト(入れ子)構造を持つJSON文字列
a_string = '{"Timetable": {"Mon": "2pm", "Wed": "9pm"}}'
print("検証対象の文字列:", a_string)
try:
json_obj = json.loads(a_string)
print("→ 有効なJSONです")
except ValueError as e:
print("→ 無効なJSONです")
実行結果
検証対象の文字列: {"Mon": "2pm", "Wed": "9pm", "Fri": "6pm"}
→ 有効なJSONです
検証対象の文字列: {"Mon": 2pm, "Wed": "9pm", "Fri": "6pm"}
→ 無効なJSONです
検証対象の文字列: {"Timetable": {"Mon": "2pm", "Wed": "9pm"}}
→ 有効なJSONです
ポイントの解説
- パターン2が失敗する理由: 値の
2pmがダブルクォートで囲まれていないため、JSONの文法上不正となり、解析時に例外が発生します。 - ネスト構造にも対応: パターン3のように、オブジェクトが入れ子になっていても
loads()は正しく解析でき、辞書として取得できます。 - 発生する例外について: 実際に送出されるのは
ValueErrorのサブクラスであるjson.JSONDecodeErrorですが、親クラスであるValueErrorをキャッチしておけば十分に対応できます。 - 検証後の活用: 変換に成功した場合、
json_objは通常のPython辞書になるため、json_obj["Mon"]のようにキーを指定して値を取り出せます。
まとめ
文字列が有効なJSONかどうかを判定したい場合は、json.loads() を try-except で包むのが最もシンプルで確実な方法です。APIレスポンスや外部ファイルの内容を扱う際には、事前にこのような検証を行うことで、予期しないエラーを防ぐことができます。
-
Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法
ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け
-
指定された文字列がキーワードであるかどうかを確認するPythonプログラム
この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ