@@ -30,9 +30,11 @@ import Data.Aeson.Types.Instances
3030import Data.Aeson.Types.Internal
3131import Data.Bits (unsafeShiftR)
3232import Data.ByteString.Builder as B
33+import qualified Data.ByteString.Lazy as BSL (null)
3334import Data.DList (DList, toList, empty)
3435import Data.Maybe (fromMaybe)
3536import Data.Monoid ((<>))
37+import Data.List (intersperse)
3638import Data.Text (Text, pack, unpack)
3739import GHC.Generics
3840import qualified Data.HashMap.Strict as H
@@ -41,7 +43,7 @@ import qualified Data.Vector.Mutable as VM
4143
4244#if !MIN_VERSION_base(4,8,0)
4345import Control.Applicative ((<*>), (<$>), pure)
44−import Data.Monoid (mempty)
46+import Data.Monoid (mempty, mconcat)
4547#endif
4648
4749--------------------------------------------------------------------------------
@@ -380,6 +382,11 @@ class RecordToEncoding f where
380382 recordToEncoding :: Options -> f a -> (B.Builder, Maybe B.Builder)
381383
382384instance (RecordToEncoding a, RecordToEncoding b) => RecordToEncoding (a :*: b) where
385+ recordToEncoding opts (a :*: b) | omitNothingFields opts =
386+ (mconcat $ intersperse (B.char7 ',') $
387+ filter (not . BSL.null . B.toLazyByteString)
388+ [fst (recordToEncoding opts a), fst (recordToEncoding opts b)]
389+ , Nothing)
383390 recordToEncoding opts (a :*: b) =
384391 (fst (recordToEncoding opts a) <> B.char7 ',' <>
385392 fst (recordToEncoding opts b),
@@ -430,6 +437,10 @@ class EncodeProduct f where
430437
431438instance ( EncodeProduct a
432439 , EncodeProduct b ) => EncodeProduct (a :*: b) where
440+ encodeProduct opts (a :*: b) | omitNothingFields opts =
441+ mconcat $ intersperse (B.char7 ',') $
442+ filter (not . BSL.null . B.toLazyByteString)
443+ [encodeProduct opts a, encodeProduct opts b]
433444 encodeProduct opts (a :*: b) = encodeProduct opts a <>
434445 B.char7 ',' <>
435446 encodeProduct opts b