[PHP] JSON形式か否かをvalidateする方法が意外と簡単だった

2020/03/08

author

masyus

仕事でJSON形式のデータをPHP経由でDBに格納する処理を実装することがありまして、その際にリクエストデータがjson形式になっているかをvalidateするロジックが必要になりましたためその時の調査結果と実装方法を紹介します。検証したCakePHPのバージョンは3.6.13、PHPは7.3です。

JSON形式か否かは、json_decode()の返り値がNULLか否かで判定可能

見出しの通りですが、

JSON形式か否かは、json_decode()の返り値がNULLか否かで判定可能

です。コードで書くと下記のようになります。

$result = json_decode($requestData['json_column']);
if ($result === null) {
    throw new Exception ('hogehoge');
}

json_decode()はJSON形式のデータをstdClassに変換し、PHPで扱えるようにします。ですが、下記に該当する場合はNULLを返します。

  • 渡された引数値がJSON形式でない
  • JSON形式ではあるものの、対象データが再帰制限を超えている

CakePHP3でJSON形式のvalidationを実装する場合

カスタムバリデーションを使うのがおすすめです。下記のように書くことができます。

<?php
namespace App\Model\Table;

use Cake\ORM\Query;
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;
    }
}

参考