@@ -94,6 +94,7 @@ module Database.PostgreSQL.Simple.FromField
94import Control.Applicative
94import Control.Applicative
95 ( Applicative, (<|>), (<$>), pure )
95 ( Applicative, (<|>), (<$>), pure )
96import Control.Exception (Exception)
96import Control.Exception (Exception)
97+import qualified Data.Aeson as JSON
97import Data.Attoparsec.Char8 hiding (Result)
98import Data.Attoparsec.Char8 hiding (Result)
98import Data.ByteString (ByteString)
99import Data.ByteString (ByteString)
99import qualified Data.ByteString.Char8 as B
100import qualified Data.ByteString.Char8 as B
@@ -441,6 +442,17 @@ fromArray typeInfo f = sequence . (parseIt <$>) <$> array delim
441 where f' | Arrays.Array _ <- item = f
442 where f' | Arrays.Array _ <- item = f
442 | otherwise = fElem
443 | otherwise = fElem
446+instance FromField JSON.Value where
447+ fromField f Nothing = returnError UnexpectedNull f ""
448+ fromField f (Just bs)
449+ | typeOid f /= $(inlineTypoid TI.json) =
450+ returnError Incompatible f ""
452+ case JSON.eitherDecode' $ LB.fromStrict bs of
453+ Left err -> returnError ConversionFailed f err
454+ Right val -> pure val
444type Compat = PQ.Oid -> Bool
456type Compat = PQ.Oid -> Bool
446okText, okText', okBinary, ok16, ok32, ok64, okInt :: Compat
458okText, okText', okBinary, ok16, ok32, ok64, okInt :: Compat