SlideShare a Scribd company logo
JSON SchemaとPHP
第72回 PHP勉強会@東京
自己紹介
• 中野 拓
• https://twitter.com/Hiraku
• http://blog.tojiru.net/
• PHP歴6年ぐらい
• 最近使ってるフレームワークはYafとPhalconです
• WebAPI関係のお仕事
• 最近コード書いてない。。
第一部
JSON
Schema
JSON SchemaとPHP
JSON Schema
• JSONの構造をバリデーションするための仕様

• http://json-schema.org/
• http://json-schema.org/latest/json-schemacore.html
JSON SchemaとPHP
JSONの例
{
“id”: 12345,
“name”: “Hiraku NAKANO”,
“tags”: [“PHP”,”JavaScript”]
}
JSON Schema
{

integer

“id”: 12345,
“name”: “Hiraku NAKANO”,
“tags”: [“PHP”,”JavaScript”]
}
id, name, tags という
プロパティを持った
オブジェクト

{

string

string[]

“type”:”object”,
“properties”: {
“id”: {“type”:”integer”},
“name”: {“type”:”string”},
“tags”: {
“type”:”array”,
“items”:{“type”:”string”}
}}}
もし型が違ったら、判定できる
{

integer

“id”: 12345,
“name”: “Hiraku NAKANO”,
“tags”: “PHP,JavaScript”
}
id, name, tags という
プロパティを持った
オブジェクト

{

string

string[]

“type”:”object”,
“properties”: {
“id”: {“type”:”integer”},
“name”: {“type”:”string”},
“tags”: {
“type”:”array”,
“items”:{“type”:”string”}
}}}
バリデーター実装

バリデーション仕様書
• JSONで記述する

• 仕様書を読み取って
バリデーションを実行する
• 言語ごとに存在
• PHP,JavaScript,Ruby,...

JSON
Schema
PHPでの実装
• JSON Schema for PHP がオススメ
https://github.com/justinrainbow/json-schema
• composerの内部で使われている
<?php
require ‘vendor/autoload.php’;
$json = ‘{“a”:1, “b”:2}’;
$schema = ‘{
“type”:”object”,
“properties”:{
“a”: {“type”:”integer”},
“b”: {“type”:”integer”}
}
}’;
$v = new JsonSchema¥Validator;
$v->check(json_decode($json), json_decode($schema));

var_dump($v->getErrors());

エラーがあれば
指摘してくれる
JSON SchemaとPHP
超単純な例
JSON

スキーマ

{}

{“type”:”object”}

“abc”

{“type”:”string”}

123

{“type”:”integer”}

[1,2,3]

{“type”:”array”}
数値なら上限下限指定できる
JSON

スキーマ

3

{

“type”:”integer”,
“minimum”:2,
“maximum”:5
}
文字列なら正規表現が使える
JSON

スキーマ

“abcdef”

{

“type”:”string”,
“pattern”:”^a.*f$”
}
よく使うパターンはformatで
JSON

スキーマ

“hiraku@tojiru.net”

{

“type”:”string”,
“format”:”email”
}

date, time, date-time,
uri, host-name, email,
ipv6, ip-address,
color, style,
型固定の配列
JSON

スキーマ

[1,2,3]

{

“type”:”array”,
“items”:{
“type”:”integer”
}
}
配列要素数の制約
JSON

スキーマ

[1,2,3]

{

“type”:”array”,
“minItems”:1,
“maxItems”:5
}
入れ子のオブジェクト
JSON

{

スキーマ

{

“type”:”object”,
“properties”:{
“alice”: ...
“bob”: {
“type”:”object”
}
}

“alice”: 123,
“bob”: {
“charlie”: 223
}
}
}

無限に入れ子可能
未定義のプロパティ拒否
JSON

{

“alice”: 123,
“bob”: 223,
“charlie”: 323
}

スキーマ

{

“type”:”object”,
“properties”: {
“alice”: ...
“bob”: ...
},
“additionalProperties”:
false
}
一通りそろってる感じがする
• 詳しくはJSON Schema for PHPのテストを参照!
• 入れ子など、構造のバリデーションが得意なのが
JSON Schemaの特徴
まとめ
• JSON Schemaを使うと、JSONをチェックして、期待通
りの構造になっているか調べることができます。
• PHPにもJSON Schemaの実装があります。
第一部
完
...
JSON SchemaとPHP
「JSONの構造を
バリデーションし
て何が嬉しいの
か?」
についてこれから解説します
第二部
PHPと
JSON
突然ですが
PHPは
JSONで
出来ています
...
って思われそうなので
もう少し丁寧に言うと
PHPのデータ構造は
JSON互換です
JSONと言えば
• boolean, number, stringなどの基本的な型
• array, object を多段に入れ子にした構造
JSON SchemaとPHP
例1

$_GET
?a[]=1&a[]=2&a[]=3&b=hogehoge

$_GET === [
‘a’ => [‘1’,’2’,’3’],
‘b’ => ‘hogehoge’
]

JSONだよね!
{

}

“type”:”object”,
“properties”:{
“a”:{
“type”:”array”,
“maxItems”:3
},
“b”:{“type”:”string”}
}
<?php
//...
$v = new JsonSchema¥Validator;
$get = json_decode(json_encode($_GET));
$v->check($get, $schema);
var_dump($v->getErrors());
普通に$_GETをバリデーションす
ると結構面倒くさい
<?php
if (
isset($_GET[‘a’], $_GET[‘b’]) &&
is_array($_GET[‘a’]) &&
count($_GET[‘a’]) <= 3 &&
is_string($_GET[‘b’])
) {
//...
}

もっと入れ子になって
いると更に厄介

issetの嵐

これだと何が原因で
駄目だったのか分か
らない
例2

関数の引数
<?php
/**
* @param int $a
* @param string $b
* @param array $config
*/
function hoge($a, $b, array $config) {
//...
}
<?php
function hoge($a, $b, array $config) {
$args = get_defined_vars();
$args === [
‘a’ => ...,
‘b’ => ...,
‘config’ => ...
];
}
{

}

“type”:”object”,
“properties”:{
“a”:{“type”:”integer”},
“b”:{“type”:”string”},
“config”:{
“type”:”object”,...
}
}
以下省略
つまり
JSON Schemaとは、
JSON相当のデータ構造なら
何でもバリデーションできる
応用範囲の超広い
ライブラリなのです
JSON SchemaとPHP
まとめ
• PHP=だいたいJSON
• ゆえに、JSON SchemaはPHPのデータ構
造ならだいたい何でもバリデーションでき
る
• 手持ちのバリデーションライブラリの1つ
として、覚えておくといいと思います
$ composer require justinrainbow/json-schema
(依存パッケージもないので割と使いやすいと思う)

完

More Related Content

PDF
Building the Game Server both API and Realtime via c#
ODP
Introduction to Swagger
PPSX
Introdução a Bootstrap 3
PPTX
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
PPTX
What is Angular?
PPTX
PDF
PHPアプリケーションのコンテナ化入門
PDF
JavaScript Execution Context
Building the Game Server both API and Realtime via c#
Introduction to Swagger
Introdução a Bootstrap 3
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
What is Angular?
PHPアプリケーションのコンテナ化入門
JavaScript Execution Context

What's hot (20)

PPTX
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
PDF
スペシャリストになるには
PDF
Cqrs api v2
PPTX
Using or not using magic onion
PDF
負荷試験入門公開資料 201611
PDF
HTML5マークアップの心得と作法
PDF
Introduction to Django REST Framework, an easy way to build REST framework in...
PDF
Maven基礎
PDF
MongoDBのアレをアレする
PDF
NTTデータ流 Hadoop活用のすすめ ~インフラ構築・運用の勘所~
PDF
MySQLからPostgreSQLへのマイグレーションのハマリ所
PPTX
TypeScript: Basic Features and Compilation Guide
PDF
WebSocket / WebRTCの技術紹介
PDF
Jetpack datastore入門
PDF
Hiveハンズオン
PDF
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
PPTX
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
PPTX
Attacking GraphQL
PPTX
GRPC.pptx
PDF
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
スペシャリストになるには
Cqrs api v2
Using or not using magic onion
負荷試験入門公開資料 201611
HTML5マークアップの心得と作法
Introduction to Django REST Framework, an easy way to build REST framework in...
Maven基礎
MongoDBのアレをアレする
NTTデータ流 Hadoop活用のすすめ ~インフラ構築・運用の勘所~
MySQLからPostgreSQLへのマイグレーションのハマリ所
TypeScript: Basic Features and Compilation Guide
WebSocket / WebRTCの技術紹介
Jetpack datastore入門
Hiveハンズオン
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
Attacking GraphQL
GRPC.pptx
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Ad

Viewers also liked (11)

PDF
JSON Schema で Web API のスキマを埋めよう
PDF
JSON Schema と API テスト YAPC::Asia Tokyo 2014
PDF
こわくない同時実行制御
PDF
STAC2015 講演3 広告システム刷新よもやま話〜テストが当たり前となるまでにやったこと #stac2015
PDF
C#の強み、或いは何故PHPから乗り換えるのか
PDF
10分でわかる主成分分析(PCA)
PDF
はじめよう多変量解析~主成分分析編~
PDF
composer-scriptsについて
PDF
WebAPIのこれまでとこれから
PDF
Pythonによる機械学習の最前線
PDF
Phpをいじり倒す10の方法
JSON Schema で Web API のスキマを埋めよう
JSON Schema と API テスト YAPC::Asia Tokyo 2014
こわくない同時実行制御
STAC2015 講演3 広告システム刷新よもやま話〜テストが当たり前となるまでにやったこと #stac2015
C#の強み、或いは何故PHPから乗り換えるのか
10分でわかる主成分分析(PCA)
はじめよう多変量解析~主成分分析編~
composer-scriptsについて
WebAPIのこれまでとこれから
Pythonによる機械学習の最前線
Phpをいじり倒す10の方法
Ad

Similar to JSON SchemaとPHP (14)

PDF
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
PDF
Zabbix API
PDF
Phjosh(仮)プロジェクト
PPTX
Spring data-rest-and-spring-cloud-contract
PDF
ZabbixのAPIを使って運用を楽しくする話
PDF
prmdのドキュメントが読みやすくなる話
PDF
Firefox Add-on SDK 入門
PDF
イマドキの現場で使えるJavaライブラリ事情
PDF
Elasticsearchプラグインの作り方
KEY
JSON Based Web Services
PPTX
20140903groonga発表資料
PDF
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
PDF
RとWeb API
PDF
Grails 2.0.0.M1の話
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
Zabbix API
Phjosh(仮)プロジェクト
Spring data-rest-and-spring-cloud-contract
ZabbixのAPIを使って運用を楽しくする話
prmdのドキュメントが読みやすくなる話
Firefox Add-on SDK 入門
イマドキの現場で使えるJavaライブラリ事情
Elasticsearchプラグインの作り方
JSON Based Web Services
20140903groonga発表資料
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
RとWeb API
Grails 2.0.0.M1の話

More from Hiraku Nakano (7)

PDF
composerの遅さをまじめに考える #phpstudy
PDF
Composer並列化プラグイン #phpblt
PDF
Scrutinizer CIでPHPも静的解析 #phpstudy
PDF
PSR-3 Logger Interfaceの紹介
PPTX
pecl-AOPの紹介
PPTX
URLで遊ぼう
PPTX
Xml builderの紹介
composerの遅さをまじめに考える #phpstudy
Composer並列化プラグイン #phpblt
Scrutinizer CIでPHPも静的解析 #phpstudy
PSR-3 Logger Interfaceの紹介
pecl-AOPの紹介
URLで遊ぼう
Xml builderの紹介

JSON SchemaとPHP