yamlとjson用のスキーマバリデータとデータバインディング

20
copyright© 2008 kuwata-lab.com all rights reserved. ITPro Challenge! 2008 ITPro Challenge! 2008 YAMLJSON用の スキーマバリデータと データバインディング makoto kuwata http://www.kuwata-lab.com / ITPro Challenge! 2008 LightningTalk

Upload: kwatch

Post on 21-May-2015

4.153 views

Category:

Technology


2 download

DESCRIPTION

YAMLとJSONのための、スキーマバリデータとデータバインディングについて。 スキーマバリデータとは、データの正当性を検証するツール。 データバインディングとは、YAMLやJSONのデータをオブジェクトに変換すること。

TRANSCRIPT

Page 1: YAMLとJSON用のスキーマバリデータとデータバインディング

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

Page 2: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008

YAMLとJSONの紹介

Page 3: 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

‣主にインデントでデータ構造を表現‣データが型を持つ

• 文字列• 数値(整数、小数)• 日付、タイムスタンプ• 真偽値など

‣本来はデータシリアライゼーション用

Page 4: YAMLとJSON用のスキーマバリデータとデータバインディング

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 } ] }

Page 5: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008‣ 読みやすく書きやすい

• 終了タグがいらないので簡潔

‣ 自然でわかりやすい• 配列とハッシュを使うため

‣ 表現力が強力• データに型がある• データのリンクを表現可能(YAMLのみ)

YAMLとJSONの特徴

Page 6: 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など多数

Page 7: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008

Kwalifyの紹介

Page 8: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008Kwalify

‣ YAMLとJSONのための統合ツール• パーサ

• スキーマバリデータ

• データバインディング(YAML, JSON→オブジェクトの変換のみ)

‣ http://www.kuwata-lab.com/kwalify/

Page 9: YAMLとJSON用のスキーマバリデータとデータバインディング

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のこと

Page 10: YAMLとJSON用のスキーマバリデータとデータバインディング

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のこと

Page 11: YAMLとJSON用のスキーマバリデータとデータバインディング

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 }

検証したいデータ スキーマ定義

スキーマ定義を入れ子にできる

Page 12: YAMLとJSON用のスキーマバリデータとデータバインディング

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のまま)

Page 13: YAMLとJSON用のスキーマバリデータとデータバインディング

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

Page 14: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008検証対象

YAML JSON

ArrayHash

parse

パース後のデータを検証(YAMLやJSON以外でも検証可能)

パース時に検証(より正確なエラーメッセージ)

Page 15: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008データバインディング

YAML JSON

ArrayHash

Objectparse

Hashのかわりにオブジェクトを生成

スキーマ定義にクラス名を指定しておくと・・・

超便利!!

Page 16: YAMLとJSON用のスキーマバリデータとデータバインディング

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}!"

メソッドを自由に定義して利用できる

Page 17: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008

まとめ

Page 18: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008まとめ

‣ Kwalify … YAML & JSON用の統合• パーサ

• スキーマバリデータ(パースしながら検証 or してから検証)

• データバインディング(パースしながらオブジェクトへ変換)

‣ YAMLやJSONにもスキーマあるよ!

Page 19: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

ITPro Challenge! 2008

ITPro Challenge! 2008おまけ

‣ バリデータやデータバインディングツールは、パーサと統合されるべき• バリデーションはより正確に

• バインディングはより簡潔に

Page 20: YAMLとJSON用のスキーマバリデータとデータバインディング

copyright© 2008 kuwata-lab.com all rights reserved.

thank you