JSON ドキュメントを検証する JSON 関数
このドキュメントでは、JSON ドキュメントを検証する JSON関数について説明します。
JSON_SCHEMA_VALID()
JSON_SCHEMA_VALID(schema, json_doc)
関数は、JSON ドキュメントをスキーマに対して検証し、データの整合性と一貫性を確保します。
これをチェック制約と一緒に使用すると、テーブルが変更されたときに自動的にスキーマ検証を行うことができます。
この関数はJSONスキーマ仕様に従います。
サポートされている検証キーワードは次のとおりです。
検証キーワード | 適用タイプ | 説明 |
---|---|---|
type | どれでも | タイプをテストします( array やstring など) |
enum | どれでも | 値が指定された値の配列内にあるかどうかをテストします |
const | どれでも | enum と同様だが、単一の値である |
allOf | どれでも | 指定されたスキーマすべてに一致します |
anyOf | どれでも | 指定されたスキーマのいずれかに一致する |
multipleOf | number / integer | 値が指定された値の倍数かどうかをテストします |
maximum | number / integer | 値が最大値(含む)を下回っているかどうかをテストします |
exclusiveMaximum | number / integer | 値が最大値(含まない)を下回っているかどうかをテストします |
minimum | number / integer | 値が最小値(含む)を超えているかどうかをテストします |
exclusiveMinimum | number / integer | 値が最小値(含まない)を超えているかどうかをテストします |
maxlength | string | 値の長さが指定された値を超えていないかどうかをテストします |
minLength | string | 値の長さが指定された値以上かどうかをテストします |
format | string | 文字列が名前付きフォーマットに一致するかどうかをテストします |
pattern | string | 文字列がパターンに一致するかどうかをテストします |
items | array | 配列の項目に適用するスキーマ |
prefixItems | array | 配列の位置項目に適用するスキーマ |
maxItems | array | 配列内の項目数が指定された値を超えていないかどうかをテストします |
minItems | array | 配列内の項目数が指定された値以上かどうかをテストします |
uniqueItems | array | 配列内の項目が一意かどうかをテストしますtrue / false |
contains | array | 配列に含まれるアイテムのスキーマを設定します |
maxContains | array | contains と一緒に使用して、アイテムが存在できる最大回数をテストします。 |
minContains | array | contains と一緒に使用して、アイテムが存在する最小回数をテストします。 |
properties | object | オブジェクトのプロパティに適用するスキーマ |
patternProperties | object | プロパティ名のパターンマッチングに基づいて特定のプロパティに適用するスキーマ |
additionalProperties | object | 追加プロパティが許可されるかどうか、 true / false |
minProperties | object | オブジェクトが持つことができるプロパティの最小数をテストします |
maxProperties | object | オブジェクトが持つことができるプロパティの最大数をテストします |
required | object | 指定されたプロパティ名がオブジェクト内に存在するかどうかをテストします |
例:
いくつかの例では、次の JSON ドキュメントを使用します。
{
"fruits": [
"orange",
"apple",
"pear"
],
"vegetables": [
"carrot",
"pepper",
"kale"]
}
JSON ドキュメントを保持するにはユーザー定義変数使用します。
SET @j := '{"fruits": ["orange", "apple", "pear"], "vegetables": ["carrot", "pepper", "kale"]}';
まず、次のタイプをテストします。
SELECT JSON_SCHEMA_VALID('{"type": "object"}',@j);
+--------------------------------------------+
| JSON_SCHEMA_VALID('{"type": "object"}',@j) |
+--------------------------------------------+
| 1 |
+--------------------------------------------+
1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"type": "array"}',@j);
+-------------------------------------------+
| JSON_SCHEMA_VALID('{"type": "array"}',@j) |
+-------------------------------------------+
| 0 |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT JSON_TYPE(@j);
+---------------+
| JSON_TYPE(@j) |
+---------------+
| OBJECT |
+---------------+
1 row in set (0.00 sec)
上記の出力からわかるように、 @j
の型はobject
です。これはJSON_TYPE()
の出力と一致します。
次に、特定の属性の存在を検証します。
SELECT JSON_SCHEMA_VALID('{"required": ["fruits","vegetables"]}',@j);
+---------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"required": ["fruits","vegetables"]}',@j) |
+---------------------------------------------------------------+
| 1 |
+---------------------------------------------------------------+
1 row in set (0.00 sec)
上記の出力では、属性fruits
とvegetables
の存在の検証が成功したことがわかります。
SELECT JSON_SCHEMA_VALID('{"required": ["fruits","vegetables","grains"]}',@j);
+------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"required": ["fruits","vegetables","grains"]}',@j) |
+------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)
上記の出力では、 grains
が存在しないため、 fruits
、 vegetables
およびgrains
属性の存在の検証が失敗していることがわかります。
ここで、 fruits
配列であることを検証します。
SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array"}}}',@j);
+-----------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array"}}}',@j) |
+-----------------------------------------------------------------------+
| 1 |
+-----------------------------------------------------------------------+
1 row in set (0.01 sec)
上記の出力は、 fruits
が配列であることを確認します。
SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "string"}}}',@j);
+------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "string"}}}',@j) |
+------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)
上記の出力は、 fruits
が文字列ではないことを示しています。
次に、配列内の項目の数を確認します。
SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 3}}}',@j);
+--------------------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 3}}}',@j) |
+--------------------------------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
上記の出力は、 fruits
少なくとも 3 つの項目を持つ配列であることを示しています。
SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 4}}}',@j);
+--------------------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 4}}}',@j) |
+--------------------------------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
上記の出力は、 fruits
少なくとも 4 つの項目を持つ配列ではないことを示しています。これは、項目の最小数を満たしていないためです。
整数値の場合、特定の範囲内にあるかどうかを確認できます。
SELECT JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '42');
+------------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '42') |
+------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------+
1 row in set (0.01 sec)
SELECT JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '123');
+-------------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '123') |
+-------------------------------------------------------------------------------+
| 0 |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)
文字列の場合、特定のパターンに一致するかどうかを検証できます。
SELECT JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"TiDB"');
+---------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"TiDB"') |
+---------------------------------------------------------------------+
| 1 |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"PingCAP"');
+------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"PingCAP"') |
+------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------+
1 row in set (0.00 sec)
値が特定の名前付き形式に一致するかどうかを確認できます。検証できる形式には、 ipv4
、 ipv6
、 time
、 date
、 duration
、 email
、 hostname
、 uuid
、 uri
などがあります。
SELECT JSON_SCHEMA_VALID('{"format": "ipv4"}', '"127.0.0.1"');
+--------------------------------------------------------+
| JSON_SCHEMA_VALID('{"format": "ipv4"}', '"127.0.0.1"') |
+--------------------------------------------------------+
| 1 |
+--------------------------------------------------------+
1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"format": "ipv4"}', '"327.0.0.1"');
+--------------------------------------------------------+
| JSON_SCHEMA_VALID('{"format": "ipv4"}', '"327.0.0.1"') |
+--------------------------------------------------------+
| 0 |
+--------------------------------------------------------+
1 row in set (0.00 sec)
enum
使用して、文字列が配列内にあるかどうかを確認することもできます。
SELECT JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"TiDB"');
+------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"TiDB"') |
+------------------------------------------------------------+
| 1 |
+------------------------------------------------------------+
1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"MySQL"');
+-------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"MySQL"') |
+-------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"SQLite"');
+--------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"SQLite"') |
+--------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------+
1 row in set (0.00 sec)
anyOf
使用すると、特定の要件を組み合わせて、いずれかの要件が満たされているかどうかを検証できます。
SELECT JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '"TiDB"');
+------------------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '"TiDB"') |
+------------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '["TiDB", "MySQL"]');
+-----------------------------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '["TiDB", "MySQL"]') |
+-----------------------------------------------------------------------------------------------+
| 0 |
+-----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '5');
+-------------------------------------------------------------------------------+
| JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '5') |
+-------------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MySQL 互換性
JSON_SCHEMA_VALID()
で検証するスキーマが無効な場合 ({"type": "sting"}
など)、MySQL はそれを受け入れる可能性がありますが、 TiDB はエラーを返します。"sting"
にスペルミスがあり、"string"
である必要があることに注意してください。- MySQL は、JSON スキーマ標準の古いドラフト バージョンを使用します。