yamlとjson用のスキーマバリデータとデータバインディング
DESCRIPTION
YAMLとJSONのための、スキーマバリデータとデータバインディングについて。 スキーマバリデータとは、データの正当性を検証するツール。 データバインディングとは、YAMLやJSONのデータをオブジェクトに変換すること。TRANSCRIPT
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008YAMLとJSON用の
スキーマバリデータとデータバインディング
makoto kuwatahttp://www.kuwata-lab.com/
ITPro Challenge! 2008 LightningTalk
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008
YAMLとJSONの紹介
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008YAML
- id: 101 date: 2008-09-05 customer: name: 山田XXX addr: 文京区X-X lines: - item: 商品A price: 800 count: 3 - item: 商品B price: 1400 count: 2
‣主にインデントでデータ構造を表現‣データが型を持つ
• 文字列• 数値(整数、小数)• 日付、タイムスタンプ• 真偽値など
‣本来はデータシリアライゼーション用
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008JSON
‣ { } と [ ] でデータ構造を表現‣データが型を持つ
• 文字列• 数値(整数、小数)• 日付、タイムスタンプ• 真偽値
‣YAMLのサブセット(一部非互換)
{ "id": 101, "date": "2008-09-05", "customer": { "name": "山田XXX", "addr": "文京区X-X" }, "lines": [ { "item": "商品A", "price": 800, "count": 3 }, { "item": "商品B", "price": 1400, "count": 2 } ] }
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008‣ 読みやすく書きやすい
• 終了タグがいらないので簡潔
‣ 自然でわかりやすい• 配列とハッシュを使うため
‣ 表現力が強力• データに型がある• データのリンクを表現可能(YAMLのみ)
YAMLとJSONの特徴
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008YAMLとJSONの弱点
‣ 関連ツールが弱い• スキーマバリデータ
- データの正当性を検証する
- XMLならXML Schema, RELAX NG, DTD
• データバインディング- データをオブジェクトに変換する(またはその逆)
- XMLならJAXB, Castor, JiBXなど多数
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008
Kwalifyの紹介
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008Kwalify
‣ YAMLとJSONのための統合ツール• パーサ
• スキーマバリデータ
• データバインディング(YAML, JSON→オブジェクトの変換のみ)
‣ http://www.kuwata-lab.com/kwalify/
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008スキーマ定義例(1)
- foo- bar- baz
type: seqsequence: - type: str required: true unique: true
検証したいデータ スキーマ定義
配列の要素は一意な文字列、かつ必須項目(省略不可)
sequenceとはArrayのこと
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008スキーマ定義例(2)
id: 101name: FooBar
type: mapmapping: "id": type: int required: true range: { min: 1 } "name": type: str required: true length: { max: 255 }
検証したいデータ スキーマ定義
id は整数で 1 以上、かつ必須項目(省略不可)
name は文字列で必須項目、最大255文字まで
mappingとはHashのこと
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008スキーマ定義例(3)
- id: 101 name: Foo- id: 102 name: Bar
type: seqsequence: - type: map mapping: "id": type: int range: { min: 1 } "name": type: str length: { max: 255 }
検証したいデータ スキーマ定義
スキーマ定義を入れ子にできる
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008スキーマ定義例(4)
[ { "id": 101, "name": "Foo" }, { "id": 102, "name:" "Bar" } ]
{ "type": "seq", "sequence": [ { "type": "map", "mapping": { "id": { "type": "int" }, "name": { "type": "str", "length": { "max": 255} } } } ]}
検証したいデータ スキーマ定義
スキーマ定義はJSONでもOK(ただし用語はYAMLのまま)
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008サンプルコード (Ruby)## スキーマをもとにバリデータを作成require 'kwalify'schema = Kwalify::Yaml.load_file('schema.yaml')validator = Kwalify::Validator.new(schema)
## バリデータつきでYAMLファイルをパースparser = Kwalify::Yaml::Parser.new(validator)document = parser.parse_file('data2.yaml')p document
## バリデーションエラーがあれば表示errors = parser.errors()if errors && !errors.empty? for e in errors puts "#{e.linenum}:#{e.column} #{e.message}" endend
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008検証対象
YAML JSON
ArrayHash
parse
パース後のデータを検証(YAMLやJSON以外でも検証可能)
パース時に検証(より正確なエラーメッセージ)
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008データバインディング
YAML JSON
ArrayHash
Objectparse
Hashのかわりにオブジェクトを生成
スキーマ定義にクラス名を指定しておくと・・・
超便利!!
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008サンプルコード (Ruby)
## Hashのままputs "Hello #{user['last_name']}, #{user['first_name']}!"
## Userクラスのオブジェクトを生成class User def full_name "#{@last_name}, #{@first_name}" endendputs "Hello #{user.full_name}!"
メソッドを自由に定義して利用できる
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008
まとめ
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008まとめ
‣ Kwalify … YAML & JSON用の統合• パーサ
• スキーマバリデータ(パースしながら検証 or してから検証)
• データバインディング(パースしながらオブジェクトへ変換)
‣ YAMLやJSONにもスキーマあるよ!
copyright© 2008 kuwata-lab.com all rights reserved.
ITPro Challenge! 2008
ITPro Challenge! 2008おまけ
‣ バリデータやデータバインディングツールは、パーサと統合されるべき• バリデーションはより正確に
• バインディングはより簡潔に
copyright© 2008 kuwata-lab.com all rights reserved.
thank you