The json-autotype package

[Tags:bsd3, library, program, test]

Generates datatype declarations with Aeson's FromJSON instances from a set of example .json files.

To get started you need to install the package, and run json-autotype binary on an input .json file. That will generate a new Aeson-based JSON parser.

$ json-autotype input.json -o JSONTypes.hs

Feel free to tweak the by changing types of the fields - any field type that is instance of FromJSON should work.

You may immediately test the parser by calling it as a script:

$ runghc JSONTypes.hs input.json

One can now use multiple input files to generate better type description.

See introduction on for details.

[Skip to Readme]


Versions,,,,,,,,,,,,,,,,,,,,,, 0.3, 0.4, 0.5, 1.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.0.6, 1.0.7, 1.0.8, 1.0.9, 1.0.10, 1.0.11, 1.0.12, 1.0.13, 1.0.14, 1.0.15 (info)
Change log
Dependencies aeson (>=0.7 && <0.12), base (>=4.3 && <4.10), bytestring (>=0.9 && <0.11), containers (>=0.3 && <0.6), filepath (>=1.3 && <1.5), GenericPretty (==1.2.*), hashable (==1.2.*), hflags (>=0.3 && <0.5), lens (>=4.1 && <4.15), mmap (==0.5.*), mtl (>=2.1 && <2.3), pretty (>=1.1 && <1.3), process (>=1.1 && <1.5), scientific (>=0.3 && <0.5), text (>=1.1 && <1.4), uniplate (==1.6.*), unordered-containers (==0.2.*), vector (>=0.9 && <0.12), yaml (==0.8.*) [details]
License BSD3
Copyright Copyright by Michal J. Gajda '2014-'2015
Author Michal J. Gajda
Stability stable
Category Data, Tools
Home page
Bug tracker
Source repository head: git clone
Uploaded Wed Dec 7 00:12:52 UTC 2016 by MichalGajda
Distributions LTSHaskell:1.0.15, NixOS:1.0.15
Downloads 4541 total (13 in the last 30 days)
2 []
Status Docs available [build log]
Last success reported on 2016-12-07 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees

Readme for json-autotype

Readme for json-autotype-1.0.15


Takes a JSON format input, and generates automatic Haskell type declarations.

Parser and printer instances are derived using Aeson.

The program uses union type unification to trim output declarations. The types of same attribute tag and similar attribute set, are automatically unified using recognition by attribute set matching. (This option can be optionally turned off, or a set of unified types may be given explicitly.) :|: alternatives (similar to Either) are used to assure that all JSON inputs seen in example input file are handled correctly.

I should probably write a short paper to explain the methodology.

Build Status Hackage Hackage Dependencies

Details on official releases are on Hackage


After installing with cabal install json-autotype, you might generate stub code for the parser:

    json-autotype input1.json ... inputN.json -o MyFormat.hs

Then you might test the parser by running it on an input file:

    runghc MyFormat.hs input.json

At this point you may see data structure generated automatically for you. The more input files you give to the inference engine json-autotype, the more precise type description will be.

Algorithm will also suggest which types look similar, based on a set of attribute names, and unify them unless specifically instructed otherwise.

The goal of this program is to make it easy for users of big JSON APIs to generate entries from example data.

Occasionally you might find a valid JSON for which json-autotype doesn't generate a correct parser. You may either edit the resulting file and send it to the author as a test case for future release.

Patches and suggestions are welcome.


The most simple example:


It will produce the module with the following datatypes and TH calls for JSON parser derivations:

    data ColorsArray = ColorsArray {
        colorsArrayHexValue    :: Text,
        colorsArrayColorName :: Text
      } deriving (Show,Eq)

    data TopLevel = TopLevel {
        topLevelColorsArray :: ColorsArray
      } deriving (Show,Eq)

Note that attribute names match the names of JSON dictionary keys.

Another example with ambiguous types:

                "parameterValue":"site API"

It will produce quite intuitive result (plus extra parentheses, and class derivations):

    data Parameter = Parameter {
        parameterParameterValue :: Bool :|: Int :|: Text,
        parameterParameterName :: Text

    data TopLevel = TopLevel {
        topLevelParameter :: Parameter

Real-world use case examples are provided in the package source repository.

Other approaches:

There is a json-sampler that allows to make simpler data structure from JSON examples, but doesn't seem to perform unification, nor is it suitable for big APIs.