@@ -25,6 +25,7 @@ import Control.Monad
2525import Data.Aeson.TH as A
2626import Data.Aeson.Types
2727import Data.List
28+import Data.Map as M
2829import Data.Maybe
2930import Data.Typeable
3031import Language.Haskell.TH
@@ -67,6 +68,8 @@ data DerivingOptions = DerivingOptions
6768 , snake :: Bool
6869 -- ^ Whether to snake constructors and field labels
6970 -- Applied after stripping prefix
71+ , convertMap :: M.Map String String
72+ -- ^ convert names (constructors and fields) before snake and strip prefix
7073 , unwrapUnaryRecords :: Bool
7174 , omitNothingFields :: Bool
7275 , sumEncoding :: SumEncoding
@@ -78,18 +81,20 @@ defaultDerivingOptions :: DerivingOptions
7881defaultDerivingOptions = DerivingOptions
7982 { prefix = Nothing
8083 , snake = True
84+ , convertMap = mempty
8185 , unwrapUnaryRecords = False
8286 , omitNothingFields = False
8387 , sumEncoding = defaultTaggedObject }
8488
8589derivingOptionsToJsonOptions :: DerivingOptions -> Options
8690derivingOptionsToJsonOptions DerivingOptions{..} = defaultOptions
87− { fieldLabelModifier = snaked . stripped
88− , constructorTagModifier = snaked . stripped
91+ { fieldLabelModifier = snaked . stripped . convert
92+ , constructorTagModifier = snaked . stripped . convert
8993 , sumEncoding
9094 , omitNothingFields
9195 , unwrapUnaryRecords }
9296 where
97+ convert s = fromMaybe s $ M.lookup s convertMap
9398 snaked = if snake then camelTo2 '_' else id
9499 stripped = maybe id stripPrefix' prefix
95100