これは何か
Perl の値 (スカラ値、ハッシュリファレンス、配列リファレンスなど) が JSON のどの型であるかを推論するモジュール。
Perl の 1
という値は JSON の number である、Perl の "a"
は JSON の string である、という風な。
配列やハッシュのようなコンテナ型も再帰的に推論する。[1,2,3]
のような値を与えると array[number] という型である、と推論する。
候補となる型が複数ある場合は直和型 (union type) として報告する。すなわち [1, 'a']
のような値は array[number|string] と推論する。
何のために使う?
もともとこのモジュールは JSON schema を自動生成することを目指して作った。
JSON schema は JSON over HTTP API を提供するときに便利な仕様群であるものの、JSON schema それ自体を記述するのはリーズナブルとは言い難い。
これはソフトウェアが再利用することを意図しているので仕方のないことではある。とはいえ書くのはだるい。
ずっと { "type": "object", "properties": {} }
と書いていると気が滅入る。
JSON schema を実際の JSON データを (複数) 与えて自動的に型や構造を出力してくれると便利そうである。
実際、そのようなことをしてくれるライブラリはある。
(参考: JSON Schema Software)
しかしながら当然 (?) Perl のライブラリは紹介されていない。CPAN でよさそうなそれらしいモジュールは見つけられなかった。なので書くことにした。
このモジュールはその一歩です。
実際に JSON schema を自動生成するデモ
JSON::TypeInference を使って実際に与えられたデータから schema を自動生成するスクリプトを書いてみた。
README にあるように eg/
以下の JSON からこんな schema が生成される:
{ "$schema" : "http://json-schema.org/draft-04/schema#", "description" : "TODO", "properties" : { "id" : { "example" : 1, "type" : "number" }, "name" : { "example" : "yuno", "type" : "string" }, "school" : { "properties" : { "location" : { "properties" : { "lat" : { "example" : 14, "type" : "number" }, "lon" : { "example" : 15, "type" : "number" } }, "type" : "object" }, "name" : { "example" : "yamabuki", "type" : "null" } }, "type" : "object" } }, "title" : "TODO", "type" : "object" }
union type の扱いが雑なのは将来的に直したい。
課題と展望
あるオブジェクトのプロパティが必ず出現すべきなのかどうか、も推論できるとよさそうと思って issue を立ててある。
Detect required properties · Issue #5 · aereal/JSON-TypeInference · GitHub