@@ -32,6 +32,7 @@ import qualified Control.Monad.State as S
3232import Data.Aeson
3333import Data.Aeson.Types (Parser)
3434import Data.Constraint
35+import Data.Maybe (catMaybes)
3536import Data.Proxy
3637import qualified Data.Text as T
3738import Data.Typeable
@@ -115,7 +116,7 @@ instance RecEq lts lts => Eq (Rec lts) where
115116
116117#ifdef WITH_AESON
117118instance
118− ( RecApply lts lts ToJSON
119+ ( RecApply lts lts EncodeField
119120 ) =>
120121 ToJSON (Rec lts)
121122 where
@@ -124,6 +125,7 @@ instance
124125
125126instance (RecSize lts ~ s, KnownNat s, RecJsonParse lts) => FromJSON (Rec lts) where
126127 parseJSON = recJsonParser defaultJSONOptions
128+
127129#endif
128130
129131instance RecNfData lts lts => NFData (Rec lts) where
@@ -552,13 +554,26 @@ reflectRecFold _ f r =
552554showRec :: forall lts. (RecApply lts lts Show) => Rec lts -> [(String, String)]
553555showRec = reflectRec @Show Proxy (\k v -> (k, show v))
554556
555−recToValue :: forall lts. (RecApply lts lts ToJSON) => JSONOptions -> Rec lts -> Value
557+class ToJSON a => EncodeField a where
558+ encodeField :: a -> Maybe Value
559+ encodeKV :: T.Text -> a -> Series
560+
561+instance ToJSON a => EncodeField a where
562+ encodeField = pure . toJSON
563+ encodeKV = (.=)
564+
565+instance {-# OVERLAPS #-} ToJSON a => EncodeField (Maybe a) where
566+ encodeField = fmap toJSON
567+ encodeKV _ Nothing = mempty
568+ encodeKV k v = k .= v
569+
570+recToValue :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Value
556571recToValue options r =
557− object $ reflectRec @ToJSON Proxy (\k v -> (T.pack (fieldTransform options k), toJSON v)) r
572+ object $ catMaybes $ reflectRec @EncodeField Proxy (\k v -> (T.pack (fieldTransform options k),) <$> encodeField v) r
558573
559−recToEncoding :: forall lts. (RecApply lts lts ToJSON) => JSONOptions -> Rec lts -> Encoding
574+recToEncoding :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Encoding
560575recToEncoding options r =
561− pairs $ mconcat $ reflectRec @ToJSON Proxy (\k v -> (T.pack (fieldTransform options k) .= v)) r
576+ pairs $ mconcat $ reflectRec @EncodeField Proxy (\k v -> (T.pack (fieldTransform options k) `encodeKV` v)) r
562577
563578recJsonParser ::
564579 forall lts s.