
On 11/04/2014 01:13 AM, Michal J Gajda wrote:
Hi Roman, fellow Haskellers,
On 04/11/2014 05:35, Roman Cheplyaka wrote:
Sounds interesting. Can you show (and include in the README) some examples of recognized json inputs and code generated for them?
There are rather extensive examples provides as unit tests in the source code repository, which I do not distribute with the package, since they may be covered by copyright of whatever APIs they were produced with (like Twitter, YouTube, Jenkins etc.). Thanks for pointing out that there should be some examples provided along the package!
The most simple example: { "colorsArray":[{ "colorName":"red", "hexValue":"#f00" }, { "colorName":"green", "hexValue":"#0f0" }, { "colorName":"blue", "hexValue":"#00f" } ] }
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: { "parameter":[{ "parameterName":"apiVersion", "parameterValue":1 }, { "parameterName":"failOnWarnings", "parameterValue":false }, { "parameterName":"caller", "parameterValue":"site API" }] }
It will produce quite intuitive result (plus extra parentheses, and class derivations):
data Parameter = Parameter { parameterParameterValue :: Either Bool (Either Int Text), parameterParameterName :: Text }
data TopLevel = TopLevel { topLevelParameter :: Parameter }
I will add these examples to the README.
For real world use cases you might look at the current unit test directory. All of .json files there generate the correct parsers: https://github.com/mgajda/json-autotype/tree/master/test -- Best regards Michal
I imagine unpacking N layers of ‘Either’ would get really boring really fast. Did you consider rolling your own sum types once it gets past certain depth? I think even doubly nested Either is already getting inconvenient. -- Mateusz K.