Popularity
6.8
Stable
Activity
0.0
Stable
30
2
2
Monthly Downloads: 1
Programming language: Haskell
License: BSD 3-clause "New" or "Revised" License
Latest version: v0.0.0.0
generic-override-aeson alternatives and similar packages
Based on the "generic" category.
Alternatively, view generic-override-aeson alternatives based on common mentions on social networks and blogs.
SaaSHub - Software Alternatives and Reviews
SaaSHub helps you find the best software and product alternatives
Promo
www.saashub.com
Do you think we are missing an alternative of generic-override-aeson or a related project?
README
generic-override
For the associated blog post describing how this works, see Overriding Type Class Instances.
This repo contains the following libraries -
This library provides the ability to override instances used by generic derivation.
Example
-- Needed for constructing our 'Override' type in the DerivingVia clause.
import Data.Override (Override(Override), As)
-- Provides aeson support for generic-override (lives in generic-override-aeson).
import Data.Override.Aeson ()
-- Basic imports we need for the example.
import Data.Aeson (ToJSON(toJSON))
import Data.Text (Text)
import qualified Data.Text as Text
-- | A simple record type. We'll use generic derivation for the 'ToJSON' instance
-- but override the instances used by derivation for the 'String' and 'baz'
-- fields.
data MyRec = MyRec
{ foo :: Int
, bar :: String
, baz :: Text
} deriving stock (Show, Eq, Generic)
deriving (ToJSON)
via Override MyRec
'[ -- Derive the 'String' field via 'CharArray'.
String `As` CharArray
-- Derive the 'baz' field via 'Uptext'.
, "baz" `As` Uptext
]
-- | Newtype wrapper to override 'ToJSON Text' instances with ones that
-- encode the 'Text' as uppercase.
newtype Uptext = Uptext { unUptext :: Text }
instance ToJSON Uptext where
toJSON = toJSON . Text.toUpper . unUptext
-- | Newtype wrapper to override 'ToJSON String' instances with ones that
-- encode the 'String' as a JSON array of characters.
newtype CharArray = CharArray { unCharArray :: String }
instance ToJSON CharArray where
toJSON = toJSON . map (:[]) . unCharArray
Let's serialize an example MyRec
to JSON -
% ghci
> :{
Data.ByteString.Lazy.Char8.putStrLn
$ Data.Aeson.encode
$ Data.Aeson.toJSON MyRec { foo = 12, bar = "hi", baz = "bye" }
:}
{"foo":12,"bar":["h","i"],"baz":"BYE"}
For more examples, see the test suite in [generic-override-aeson](./aeson/test/Test.hs).