diff --git a/purescript-iso.cabal b/purescript-iso.cabal
--- a/purescript-iso.cabal
+++ b/purescript-iso.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: a43d5ec3d9017065ae05e5357c9112d551d36e5abf3184248379ba30bc7a97d8
+-- hash: 1ac457c2e840c68856d81fe509f3eeec0c7612ec55a6ecd803f01902d5c3d8ff
 
 name:           purescript-iso
-version:        0.0.5
+version:        0.0.6
 synopsis:       Isomorphic trivial data type definitions over JSON
 description:    Please see the README on GitHub at <https://github.com/githubuser/purescript-iso#readme>
 category:       Web
@@ -34,6 +34,7 @@
       Data.Aeson.JSONEmailAddress
       Data.Aeson.JSONInt
       Data.Aeson.JSONInteger
+      Data.Aeson.JSONMaybe
       Data.Aeson.JSONScientific
       Data.Aeson.JSONString
       Data.Aeson.JSONTuple
@@ -69,6 +70,7 @@
     , time
     , utf8-string
     , uuid
+    , vector
     , zeromq4-haskell
     , zeromq4-simple
   default-language: Haskell2010
@@ -107,6 +109,7 @@
     , time
     , utf8-string
     , uuid
+    , vector
     , zeromq4-haskell
     , zeromq4-simple
   default-language: Haskell2010
diff --git a/src/Data/Aeson/JSONMaybe.hs b/src/Data/Aeson/JSONMaybe.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aeson/JSONMaybe.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE
+    OverloadedStrings
+  , OverloadedLists
+  , DeriveGeneric
+  , DeriveAnyClass
+  #-}
+
+module Data.Aeson.JSONMaybe where
+
+import Data.Aeson (ToJSON (..), FromJSON (..), Value (String, Array))
+import Data.Aeson.Types (typeMismatch)
+import qualified Data.Vector as V
+import Control.DeepSeq (NFData)
+import Test.QuickCheck (Arbitrary (..))
+import Test.QuickCheck.Gen (oneof)
+import GHC.Generics (Generic)
+
+
+data JSONMaybe a
+  = JSONNothing
+  | JSONJust a
+  deriving (Eq, Ord, Show, Generic, NFData)
+
+instance (ToJSON a) => ToJSON (JSONMaybe a) where
+  toJSON x = case x of
+    JSONNothing -> String ""
+    JSONJust y -> Array [toJSON y]
+
+instance (FromJSON a) => FromJSON (JSONMaybe a) where
+  parseJSON json = case json of
+    String s
+      | s == "" -> pure JSONNothing
+      | otherwise -> fail'
+    Array a
+      | length a == 1 -> JSONJust <$> parseJSON (a V.! 0)
+      | otherwise -> fail'
+    _ -> fail'
+    where
+      fail' = typeMismatch "JSONMaybe" json
+
+instance (Arbitrary a) => Arbitrary (JSONMaybe a) where
+  arbitrary = oneof
+    [ pure JSONNothing
+    , JSONJust <$> arbitrary
+    ]
diff --git a/test/Spec.hs b/test/Spec.hs
--- a/test/Spec.hs
+++ b/test/Spec.hs
@@ -4,6 +4,7 @@
 
 import Data.Aeson.JSONUnit (JSONUnit)
 import Data.Aeson.JSONEither (JSONEither)
+import Data.Aeson.JSONMaybe (JSONMaybe)
 import Data.Aeson.JSONTuple (JSONTuple)
 import Data.Aeson.JSONDateTime (JSONDateTime)
 import Data.Aeson.JSONString (JSONString)
@@ -55,6 +56,7 @@
   registerTopic "ServerToClient" (Proxy :: Proxy ServerToClient)
   registerTopic "JSONUnit" (Proxy :: Proxy JSONUnit)
   registerTopic "JSONEither" (Proxy :: Proxy (JSONEither JSONUnit JSONUnit))
+  registerTopic "JSONMaybe" (Proxy :: Proxy (JSONMaybe JSONUnit))
   registerTopic "JSONTuple" (Proxy :: Proxy (JSONTuple JSONUnit JSONUnit))
   registerTopic "JSONDate" (Proxy :: Proxy Day)
   registerTopic "JSONDateTime" (Proxy :: Proxy JSONDateTime)
