Template Haskell macros to derive ToJSON/FromJSON instances in a more prefix-friendly manner.
APACHE-2.0 License
Template Haskell macros to derive ToJSON/FromJSON instances in a more prefix-friendly manner.
Suppose you want to create a JSON like this:
{
"id": "ID STRING",
"max": 0.789,
"min": 0.123
}
You'd want to define a record type to derive the instance of ToJSON (and possibly FromJSON) automatically:
{-# LANGUAGE TemplateHaskell #-}
import Data.Aeson.TH
data SomeRecord = SomeRecord
{ id :: String
, max :: Double
, min :: Double
} deriving (Eq, Show)
$(deriveToJSON ''SomeRecord)
But you shouldn't define such a record because both id
, max
, and min
are predefined functions of Prelude
!!
As a workaround, we frequently prefix the record labels with their type name:
data SomeRecord = SomeRecord
{ someRecordId :: String
, someRecordMax :: Double
, someRecordMin :: Double
} deriving (Eq, Show)
Then deriveToJSON
with a modified option:
deriveToJSON Json.defaultOptions { fieldLabelModifier = firstLower . drop (length "SomeRecord") } ''SomeRecord
firstLower :: String -> String
firstLower (x:xs) = toLower x : xs
firstLower _ = error "firstLower: Assertion failed: empty string"
That's almost exactly what deriveToJsonNoTypeNamePrefix
does!!
deriveToJsonNoTypeNamePrefix
is essentially defined as:
deriveToJsonNoTypeNamePrefix :: Name -> Q [Dec]
deriveToJsonNoTypeNamePrefix deriver name =
deriveToJSON Json.defaultOptions { fieldLabelModifier = dropPrefix name } name
dropPrefix :: Name -> String -> String
dropPrefix name = firstLower . drop (length $ nameBase name)
firstLower :: String -> String
firstLower (x:xs) = toLower x : xs
firstLower _ = error "firstLower: Assertion failed: empty string"
So now, you don't have reimplement the fieldLabelModifier
anymore!
import Data.Aeson.DeriveNoPrefix
$(deriveJsonNoTypeNamePrefix ''SomeRecord)
ToJSON
/ FromJSON
instances.So use this package all of them are too heavy in learning cost / dependency footprint / etc.