Safe Haskell | None |
---|---|
Language | Haskell2010 |
Data.Aeson.Yak
Description
There are two ways to use this library: the way with extra boilerplate, or the way with a leaky abstraction. A truly good solution would fix it all with Template Haskell; but the author is not a truly good Haskeller, so this will have to do for now.
The boilerplate way:
data Hideous = Hideous { yak :: [String] } instance ToJSON Hideous where toJSON x = object [ "yak" .= hairy (yak x) ] instance FromJSON Hideous where parseJSON (Object o) = Hideous <$> (shave <$> o .:? "yak")
>>>
encode $ Hideous ["foo","bar"]
"{\"yak\":[\"foo\",\"bar\"]}">>>
encode $ Hideous ["baz"]
"{\"yak\":\"baz\"}">>>
encode $ Hideous []
"{\"yak\":null}">>>
yak <$> decode "{\"yak\":[\"foo\",\"bar\"]}"
Just ["foo", "bar"]>>>
yak <$> decode "{\"yak\":\"baz\"}"
Just ["baz"]>>>
yak <$> decode "{}"
Just []
The leaky way:
data Abhorrent = Abhorrent { yak :: Yak String } $(deriveJSON defaultOptions{omitNothingFields=True} ''Abhorrent)
>>>
encode . Abhorrent . hairy $ ["shaven","shorn","sheared"]
"{\"yak\":[\"shaven\",\"shorn\",\"sheared\"]}">>>
shave . yak <$> decode "{}"
Just []
Which to prefer depends on how many yaks you need to deal with vs. how much you hate cleaning up yak droppings in the rest of your codebase.