@@ -18,11 +18,11 @@ import Prelude ()
1818import Prelude.Compat
1919
2020import Control.Monad (forM, forM_)
21−import Data.Aeson ((.=), (.:), (.:?), (.:!), FromJSON(..), FromJSONKeyFunction(..), FromJSONKey(..), ToJSON1(..), decode, eitherDecode, encode, genericToEncoding, genericToJSON, object, withObject)
21+import Data.Aeson ((.=), (.:), (.:?), (.:!), FromJSON(..), FromJSONKeyFunction(..), FromJSONKey(..), ToJSON1(..), decode, eitherDecode, encode, fromJSON, genericParseJSON, genericToEncoding, genericToJSON, object, withObject)
2222import Data.Aeson.Internal (JSONPathElement(..), formatError)
2323import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
2424import Data.Aeson.Text (encodeToTextBuilder)
25−import Data.Aeson.Types (Options(..), ToJSON(..), Value, camelTo, camelTo2, defaultOptions, omitNothingFields)
25+import Data.Aeson.Types (Options(..), Result(Success), ToJSON(..), Value(Null), camelTo, camelTo2, defaultOptions, omitNothingFields, parse)
2626import Data.Char (toUpper)
2727import Data.Either.Compat (isLeft, isRight)
2828import Data.Hashable (hash)
@@ -92,6 +92,7 @@ tests = testGroup "unit" [
9292 , testCase "PR #455" pr455
9393 , testCase "Unescape string (PR #477)" unescapeString
9494 , testCase "Show Options" showOptions
95+ , testGroup "SingleMaybeField" singleMaybeField
9596 ]
9697
9798roundTripCamel :: String -> Assertion
@@ -496,7 +497,26 @@ showOptions =
496497 ++ "}")
497498 (show defaultOptions)
498499
500+newtype SingleMaybeField = SingleMaybeField { smf :: Maybe Int }
501+ deriving (Eq, Show, Generic)
502+
503+singleMaybeField :: [Test]
504+singleMaybeField = do
505+ (gName, gToJSON, gToEncoding, gFromJSON) <-
506+ [ ("generic", genericToJSON opts, genericToEncoding opts, parse (genericParseJSON opts))
507+ , ("th", toJSON, toEncoding, fromJSON) ]
508+ return $
509+ testCase gName $ do
510+ assertEqual "toJSON" Null (gToJSON v)
511+ assertEqual "toEncoding" (toEncoding (gToJSON v)) (gToEncoding v)
512+ assertEqual "fromJSON" (Success v) (gFromJSON Null)
513+ where
514+ v = SingleMaybeField Nothing
515+ opts = defaultOptions{omitNothingFields=True,unwrapUnaryRecords=True}
516+
499517deriveJSON defaultOptions{omitNothingFields=True} ''MyRecord
500518
501519deriveToJSON defaultOptions ''Foo
502520deriveToJSON1 defaultOptions ''Foo
521+
522+deriveJSON defaultOptions{omitNothingFields=True,unwrapUnaryRecords=True} ''SingleMaybeField