解説
AIが返したJSONを、そのまま使わない:構文・型・必要項目を分けて確認しよう
JSONとして読めることと、必要なデータになっていることは別。Pythonの短い検査で、欠けた項目、文字列になった数量、余計な項目を見分けよう。

AIへ「JSONで返して」と頼んだら、中かっこと引用符が並ぶ答えが出た。形が整っていても、そのままシステムへ渡してよいとは限らないよ。今回は、読める形式か、必要な項目か、値の型が合うかを分けて検査しよう。
Python 3を実行できる環境を使う。題材は架空の商品データで、AIサービスを実行する必要はない。本文の例は編集部が作ったテスト入力で、モデルが実際に返した回答ではないよ。
JSONとして読めるかを最初に確認する
JSONは、文字列、数値、配列、オブジェクトなどでデータを表す形式。Pythonの標準ライブラリjsonには、文字列を読み取るjson.loadsがある。
import json
value = json.loads('{"name": "notebook", "quantity": 2}')
ここで読めたとしても、nameとquantityがそろう保証はない。たとえば{"message":"done"}もJSONとしては読める。パースできたことを、業務上使えるデータの確認に置き換えないようにしよう。
今回の入力ルールを決める
この練習では、次の条件だけを扱う。
- 一つのオブジェクトである。
- 項目はnameとquantityの二つだけ。
- nameは空でない文字列。
- quantityは1〜99の整数。真偽値は受け付けない。
たとえばquantityが文字列の"2"なら、このルールでは不合格。自動で2へ変換せず、提供元へ確認する方針にする。どの形式を許可するかは、利用する処理に合わせて決める必要があるよ。
小さな検査で、合否を分けよう
検査スクリプトとサンプル入力を保存し、Python 3で実行できる。
python3 validate_item.py
スクリプトには架空の入力例が入っており、外部へ接続しない。期待する表示は次の四行。
valid: OK
syntax: NG (json)
wrong-type: NG (quantity)
extra-field: NG (keys)
編集部では、実際にこの出力を確認した。入力条件を変えたいときは、スクリプト冒頭の関数とサンプルを一緒に見直そう。
Pythonでは、boolとintの関係にも注意
今回の検査では、type(quantity) is intで整数かどうかを調べている。Pythonではboolがintのサブクラスなので、isinstance(True, int)はtrueになる。数量にtrueを受け付けたくないため、型を厳密に比較しているんだ。
また、JSONの重複した項目名やNaNなどを黙って受け入れないよう、このスクリプトでは読み取り時に拒否している。標準ライブラリの既定の挙動と、今回の検査方針は分けて読んでね。
形式が合っても、内容が正しいとは限らない
この検査では、notebookという商品が実在するか、在庫があるかまでは分からない。数量が範囲内でも、元の注文が5個なら2個は誤りだよ。形式・型の検査の後に、元資料や業務条件との照合を行おう。
複雑な構造を扱うなら、スキーマによる検証なども候補になる。サービス側に出力形式を制約する機能がある場合も、対象モデル・制約・エラー時の扱いを確認しよう。ここで紹介したPython関数が、あらゆるJSONの検証器になるわけではないよ。
事実との照合については、AIの事実と推測を分ける記事も参考になるね。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。