#!/usr/bin/python # -*- coding: utf-8 -*- from sys import argv, stderr from os.path import split from json import load, dumps from jsonschema import Draft4Validator, FormatChecker def bailout(s): print >>stderr, s exit(1) def loadJSON(p): try: with open(str(p), "r") as f: try: json = load(f) except ValueError, err: bailout ("%s: %s" % (p, err)) except IOError, err: bailout(err) return json def sortkey(k): """ Treat keys as lowercase, prefer keys with less path segments """ return (len(k.path), "/".join(str(k.path)).lower()) def main(): if len(argv)==3: schp, jsonp = argv[1:3] else: bailout("Usage: %s <schemafile> <jsonfile>" % split(argv[0])[-1]) schema = loadJSON(schp) json = loadJSON(jsonp) validator = Draft4Validator(schema, format_checker=FormatChecker()) for error in sorted(validator.iter_errors(json), key=sortkey): print ( "Validation error: key \"%s\", value \"%s\", expected - %s, error message - %s\n" % ( u"/".join(str(v) for v in error.path), error.instance, error.schema.get('description', 'no additional info'), error.message ) ).encode("UTF-8") main()