@@ -581,41 +581,53 @@ data Options = Options
581 -- the constructor tag. If 'False' the encoding will always
581 -- the constructor tag. If 'False' the encoding will always
582 -- follow the `sumEncoding`.
582 -- follow the `sumEncoding`.
583 , omitNothingFields :: Bool
583 , omitNothingFields :: Bool
584− -- ^ If 'True' record fields with a 'Nothing' value will be
584+ -- ^ If 'True', record fields with a 'Nothing' value will be
585− -- omitted from the resulting object. If 'False' the resulting
585+ -- omitted from the resulting object. If 'False', the resulting
586 -- object will include those fields mapping to @null@.
586 -- object will include those fields mapping to @null@.
588+ -- Note that this /does not/ affect parsing: 'Maybe' fields are
589+ -- optional regardless of the value of 'omitNothingFields', subject
590+ -- to the note below.
588 -- === Note
592 -- === Note
590 -- Setting 'omitNothingFields' to 'True' only affects fields which are of
594 -- Setting 'omitNothingFields' to 'True' only affects fields which are of
591− -- type 'Maybe' /uniformly/ in the 'ToJSON' or 'FromJSON' instance. In
595+ -- type 'Maybe' /uniformly/ in the 'ToJSON' instance.
592− -- particular, if the type of a field is declared as a type variable, it
596+ -- In particular, if the type of a field is declared as a type variable, it
593 -- will not be omitted from the JSON object, unless the field is
597 -- will not be omitted from the JSON object, unless the field is
594 -- specialized upfront in the instance.
598 -- specialized upfront in the instance.
600+ -- The same holds for 'Maybe' fields being optional in the 'FromJSON' instance.
596 -- ==== __Example__
602 -- ==== __Example__
598 -- The generic instance for the following type @Fruit@ depends on whether
604 -- The generic instance for the following type @Fruit@ depends on whether
599 -- the instance head is @Fruit a@ or @Fruit (Maybe a)@.
605 -- the instance head is @Fruit a@ or @Fruit (Maybe a)@.
602− -- data Fruit a =
608+ -- data Fruit a = Fruit
603 -- { apples :: a -- A field whose type is a type variable.
609 -- { apples :: a -- A field whose type is a type variable.
604 -- , oranges :: 'Maybe' Int
610 -- , oranges :: 'Maybe' Int
605− -- }
611+ -- } deriving 'Generic'
607− -- options :: 'Options'
608− -- options = 'defaultOptions' { 'omitNothingFields' = 'True' }
610 -- -- apples required, oranges optional
613 -- -- apples required, oranges optional
611 -- -- Even if 'Data.Aeson.fromJSON' is then specialized to (Fruit ('Maybe' a)).
614 -- -- Even if 'Data.Aeson.fromJSON' is then specialized to (Fruit ('Maybe' a)).
612− -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit a) where
615+ -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit a)
613− -- 'Data.Aeson.fromJSON' = 'Data.Aeson.genericFromJSON' options
615 -- -- apples optional, oranges optional
617 -- -- apples optional, oranges optional
616 -- -- In this instance, the field apples is uniformly of type ('Maybe' a).
618 -- -- In this instance, the field apples is uniformly of type ('Maybe' a).
617− -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit ('Maybe' a)) where
619+ -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit ('Maybe' a))
618− -- 'Data.Aeson.fromJSON' = 'Data.Aeson.genericFromJSON' options
620+ --
621+ -- options :: 'Options'
622+ -- options = 'defaultOptions' { 'omitNothingFields' = 'True' }
624+ -- -- apples always present in the output, oranges is omitted if 'Nothing'
625+ -- instance 'Data.Aeson.ToJSON' a => 'Data.Aeson.ToJSON' (Fruit a) where
626+ -- 'Data.Aeson.toJSON' = 'Data.Aeson.genericToJSON' options
628+ -- -- both apples and oranges are omitted if 'Nothing'
629+ -- instance 'Data.Aeson.ToJSON' a => 'Data.Aeson.ToJSON' (Fruit ('Maybe' a)) where
630+ -- 'Data.Aeson.toJSON' = 'Data.Aeson.genericToJSON' options
620 , sumEncoding :: SumEncoding
632 , sumEncoding :: SumEncoding
621 -- ^ Specifies how to encode constructors of a sum datatype.
633 -- ^ Specifies how to encode constructors of a sum datatype.