on master help sign in
Fix #293
159de4fBas van Dijk
Data/Aeson/TH.hs+10−5
@@ -505,11 +505,16 @@ argsToEncoding opts multiCons (RecC conName ts) = case (unwrapUnaryRecords opts,
505 (maybes, rest) = partition isMaybe argCons
505 (maybes, rest) = partition isMaybe argCons
506
506
507 maybeToPair (arg, (field, _, _)) =
507 maybeToPair (arg, (field, _, _)) =
508+ infixApp
509+ (infixApp
510+ (infixE
508− infixApp (infixE (Just $ toFieldName field)
511+ (Just $ toFieldName field <^> [|E.char7 ':'|])
509− [|(.=)|]
512+ [|(<>)|]
510− Nothing)
513+ Nothing)
514+ [|(.)|]
515+ [|E.builder|])
511− [|(<$>)|]
516+ [|(<$>)|]
512− (varE arg)
517+ (varE arg)
513
518
514 toPair (arg, (field, _, _)) =
519 toPair (arg, (field, _, _)) =
515 toFieldName field <:> [|E.builder|] `appE` varE arg
520 toFieldName field <:> [|E.builder|] `appE` varE arg
tests/UnitTests.hs+7−2
@@ -1,11 +1,12 @@
1−{-# LANGUAGE CPP, DeriveGeneric, OverloadedStrings, ScopedTypeVariables #-}
1+{-# LANGUAGE CPP, DeriveGeneric, OverloadedStrings, ScopedTypeVariables, TemplateHaskell #-}
2
2
3module UnitTests (ioTests, tests) where
3module UnitTests (ioTests, tests) where
4
4
5import Control.Monad (forM)
5import Control.Monad (forM)
6import Data.Aeson (decode, eitherDecode, encode, genericToJSON, genericToEncoding)
6import Data.Aeson (decode, eitherDecode, encode, genericToJSON, genericToEncoding)
7+import Data.Aeson.TH ( deriveJSON )
7import Data.Aeson.Encode (encodeToTextBuilder)
8import Data.Aeson.Encode (encodeToTextBuilder)
8−import Data.Aeson.Types (ToJSON(..), Value, camelTo, camelTo2, defaultOptions)
9+import Data.Aeson.Types (ToJSON(..), Value, camelTo, camelTo2, defaultOptions, omitNothingFields)
9import Data.Char (toUpper)
10import Data.Char (toUpper)
10import Data.Time (UTCTime)
11import Data.Time (UTCTime)
11import Data.Time.Format (parseTime)
12import Data.Time.Format (parseTime)
@@ -184,3 +185,7 @@ encoderComparisonTests = do
184 , "twitter100.json"
185 , "twitter100.json"
185 , "twitter50.json"
186 , "twitter50.json"
186 ]
187 ]
188+
189+-- A regression test for: https://github.com/bos/aeson/issues/293
190+data MyRecord = MyRecord {field1 :: Maybe Int, field2 :: Maybe Bool}
191+deriveJSON defaultOptions{omitNothingFields=True} ''MyRecord