昨日、JSONSchema ヴァリデーターを漸くリリースしました。XML Schema と同じようなJSONSchemaは JSON文書の構造が正しいかどうかを検証するための文書。さらに、jsonschema ヴァリデーターはそのJSONSchema文書に従ってJSON文書が正しいかどうかを検証するPythonモジュール。JSON Schema Proposal Second Draftを基にしています。

ソースコードはこちらからダウンロードできます:jsonschema-0.1a.tar.gz
ドキュメンテーションはこちら: jsonschema (version 0.1a) documentation (日本語 README)

JSONSchemaはJSON文書の構造を検証するために作られている。JSON文書の構造、データ形式を定義することが出来る。例えば、連絡先のデータがあるとしましょう。

{
  "name": "Ian Lewis",
  "email": "IanLewis@xyz.com",
  "address": "123 Main St.",
  "phone": "080-1942-9494"
}

その文書をJSONSchemaで定義すると、以下のようのJSONSchemaが出る

{
  "type":"object",
  "properties":{
    "name": {"type":"string"},
    "age": {"type":"int", "optional":True},
    "email": {
      "type":"string",
      "pattern":"^[A-Za-z0-9][A-Za-z0-9\.]*@([A-Za-z0-9]+\.)+[A-Za-z0-9]+$"
    },
    "address": {"type":"string"},
    "phone": {"type":"string"}
  }
}

さらに、以下の Python コードでこのJSON文書は当てるかどうかを検証するこどができる。

import jsonschema, simplejson

data = """{
  "name": "Ian Lewis",
  "email": "IanLewis@xyz.com",
  "address": "123 Main St.",
  "phone": "080-1942-9494"
}"""

schema = """{
  "type":"object",
  "properties":{
    "name": {"type":"string"},
    "age": {"type":"int", "optional":True},
    "email": {
      "type":"string",
      "pattern":"^[A-Za-z0-9][A-Za-z0-9\.]*@([A-Za-z0-9]+\.)+[A-Za-z0-9]+$"
    },
    "address": {"type":"string"},
    "phone": {"type":"string"}
  }
}"""

x = simplejson.loads(data)
s = simplesjson.loads(schema)
jsonschema.validate(x,s)

JSONSchemaに拡張プロパティを付けることや、デフォルト検証処理を変更することができるので、とても柔軟なモジュールだと思っています (自分が作ったことについて言えるかなぁ ^^; ) 。 僕自身はGAEのプロジェクトで使うつもりだし、皆さんのご意見を是非聞かせてもらいたいと思います。