The structure of the generated JSON is meant to be close to idiomatic JSON. This means:
-
Enumerations (data types containing constructors without fields) are converted to JSON strings.
-
Record fields become JSON keys.
-
Data types with one unlabeled field convert to just that field.
-
Data types with multiple unlabeled fields become arrays.
-
Multiple constructors are represented by keys.
-
Maybe
values are either an absent key, or the value. -
Leading and trailing underscores are removed from constructor names and record fields
See tests/Main.hs
in json-schema for more examples.
generic-aeson contains more special cases for creating more concise and idiomatic json. If you're working with the JSON representation directly generic-aeson should feel more natural.
Changing the format would incur a breaking change to every API that uses generic-aeson so we must keep it intact.
If we find a bug where the fix changes the format we need to create a new package or version the generation code.
json-schema has generic derivation of schemas that match the generic-aeson format.