Types and type classes for defining JSON schemas.

Version on this page:
LTS Haskell 12.26:
Stackage Nightly 2018-09-28:
Latest on Hackage:

See all snapshots json-schema appears in

BSD-3-Clause licensed by Silk
Maintained by [email protected]
This version can be pinned in stack with:json-schema-,2316


Build Status

json-schema is like XML schemas, but for JSON. It’s haskell specific and has no relation to json-schema.org.

The package provides

  • An AST type Schema defining the structure of a JSON object.
  • A type class JSONSchema to define a schema for a type.
  • Combinators for defining schemas.
  • A module for validating Aeson values against schemas.
  • Built-in instances matching aeson’s.
  • A Generics module matching aeson instances generated by generics-aeson

If you use another library for generating JSON instances (such as aeson’s built-in generics/template haskell) or write aeson instances by hand you will not get matching JSONSchema instances if you use json-schema’s generics module.

This package assumes that your ToJSON and FromJSON instances match.


This package is available on hackage

$ cabal install json-schema


see the examples folder or The test suite.



  • aeson-0.10 produces new error messages so the test-suite was updated to reflect this.

  • Raise upper length limit of UTCTime since aeson-0.9 increased the precision.
  • Add JSONSchema Aeson.Value instance.

  • Allow generic-deriving 1.8.*
  • Allow vector 0.11.*

  • Allow aeson 0.9.*

  • Allow attoparsec 0.13.*

  • Fix compilation on GHC 7.2 and 7.4

  • Allow tagged 0.8.* in test-suite

  • Allow tagged 0.8.*

  • test-suite: Allow aeson-utils 0.3.*

  • Add JSONSchema instances for all standard Num types and Scientific.

  • Add JSONSchema instances for Double, Float, Fixed

  • Allow generic-deriving 1.7.*

  • Export GJSONSchema type to allow clients to write type signatures for gSchema and gSchemaWithSettings.

  • Allow time 1.5.*

  • Drop support for old tasty versions

  • Removed the Null constructor from Schema, use Data.JSON.Schema.Combinators.nullable instead.

  • Added the Validation module that can be used to validate a json object against a schema and to get descriptive error messages.

  • Updates for Maybe fixes in generic-aeson including more thorough test cases.

  • Bugfix: Remove underscores from fields and constructors in generated schemas to match generic-aeson.


  • Add JSONSchema instances for tuples up to length 15 (matching aeson 0.8 instances)
  • Specify uniqueness for JSONSchema instances for Set.


Breaking changes:

  • Add Constant Aeson.Value type to Schema
  • Change Number to take a Bound for the boundary. Before this the upper bound could not be -1.
  • Change Value and Array to take a LengthBound. The difference from Number is that these values should always be >= 0 if present.


  • Add Bound { lower :: Maybe Int, upper :: Maybe Int }
  • Add unbounded as a shorthand for a Bound without restrictions
  • Add LengthBound { lowerLength :: Maybe Int, upperLength :: Maybe Int }
  • Add unboundedLength as a shorthand for a LengthBound without restrictions
  • Add remaining JSONSchema instances based on existing Aeson instances. UTCTime, Set, Lazy Text, and tuples up to length 7.
  • Add enum combinator as a shorthand for creating a Choice of Constants


  • JSONSchema instances for Data.Vector, Data.Map, and Data.HashMap
  • Add Map type for json objects with arbitrary keys
  • Add Any type for any json value
  • Don’t generate empty field names in ojbects for constructors without labeled fields