Skip to content
Snippets Groups Projects
json-schema-validate.py 1.31 KiB
Newer Older
Pavel Kácha's avatar
Pavel Kácha committed
#!/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()