{-# LANGUAGE DerivingVia, DataKinds #-} {-# LANGUAGE DeriveGeneric #-} module Main where import Data.Aeson import Deriving.Aeson import Deriving.Aeson.Stock import qualified Data.ByteString.Lazy.Char8 as BL data User = User { userId :: Int , userName :: String , userAPIToken :: Maybe String , userType :: String } deriving Generic deriving (FromJSON, ToJSON) via CustomJSON '[ OmitNothingFields , FieldLabelModifier '[StripPrefix "user", CamelToSnake, Rename "type" "user_type"] ] User data Foo = Foo { fooFoo :: Int, fooBar :: Int } deriving Generic deriving (FromJSON, ToJSON) via Prefixed "foo" Foo testData :: [User] testData = [User 42 "Alice" Nothing "human", User 43 "Bob" (Just "xyz") "bot"] main = do BL.putStrLn $ encode testData BL.putStrLn $ encode $ Foo 0 1