JsonValidator

30分プログラム、その687。JsonValidatorを作ってみた。
最近、とある事情で、他の人にJsonのバリデータを作らせて、そのコードレビューしてます。それはそれで楽しいけれど、やっぱり自分でコードが書きたい!
というわけで、Jsonバリデータを作ってみました。

使い方

$ python json-validator.py data1.js schema.js
Invalid Json error: Required field 'name' is missing

$ python json-validator.py data2.js schema.js
OK

ソースコード

#! /usr/bin/python
# -*- mode:python; coding:utf-8 -*-
#
# json-validator.py -
#
# Copyright(C) 2009 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2009/11/02 21:31:11
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#
import sys
import simplejson
import jsonschema

class JsonError:
    def __init__(self, message):
        self.message = message

class InvalidError(JsonError):
    def __repr__(self):
        return "Invalid Json error: %s" % self.message

class ParseError(JsonError):
    def __repr__(self):
        return "Parse error: %s" % self.message

def validate(json,schema):
    try:
        jsonschema.validate(json,schema)
    except ValueError,m:
        raise InvalidError(m)

def readAll(path):
    with open(path) as fp:
        return fp.read()

def parse(str):
    try:
        return simplejson.loads(str)
    except ValueError,m:
        raise ParseError(m)

def validateFile(jsonPath, schemaPath):
    validate(parse(readAll(jsonPath)),
             parse(readAll(schemaPath)))


if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "usage: %s <json> <schema>" % sys.argv[0]
    else:
        try:
            (_,json,schema) = sys.argv
            validateFile(json, schema)
            print "OK"
        except JsonError,m:
            sys.stderr.write("%s\n" % m)
            sys.exit(1)