仕事でjsonデータをPHP経由でDBに格納する処理を作ることがあり、リクエストデータがjson形式になっているかをチェックするロジックが必要になったので、その時の調査結果と実装方法をメモがてら。
リクエストデータがjson形式になっているかどうかは、json_decode()の返り値がNULLか否かで判定できる
結論から言うとこの通り。プログラムで書くと
1 2 3 4 |
$result = json_decode($requestData['json_column']); if ($result === null) { throw new Exception ('hogehoge'); } |
という感じで、非常に簡単に書ける。
json_decode()はjson形式のデータをstdClassに変換してPHP上で扱えるようにする関数なのだが、
- 渡された引数値がjson形式でない
- json形式ではあるものの、対象データが再帰制限を超えている
ような時にNULLを返すようになっている。
https://www.php.net/manual/ja/function.json-decode.php
CakePHP3でjsonデータのバリデーションを実装する場合
次のように、カスタムバリデーションを使うと良さげ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace App\Model\Table; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\Validation\Validator; class ArticlesTable extends Table { // ...省略 public function validationDefault(Validator $validator) { $validator ->scalar('json_column') ->add('json_column', 'custom', [ 'rule' => function ($value) { return json_decode($value) !== null; } ]); return $validator; } } |