@@ -36,32 +36,33 @@ module Data.Aeson.Types
3636 ) where
3737
3838import Control.Applicative
39−import Control.Monad (MonadPlus(..))
40−import Data.Monoid (Monoid(..))
4139import Control.DeepSeq (NFData(..))
40+import Control.Monad (MonadPlus(..))
41+import Data.Aeson.Functions (hashMap, mapHash, transformMap)
42+import Data.Attoparsec.Char8 (Number(..))
4243import Data.Data (Data)
4344import Data.Int (Int8, Int16, Int32, Int64)
44−import qualified Data.IntSet as IntSet
4545import Data.Map (Map)
4646import Data.Monoid (Dual(..), First(..), Last(..))
47+import Data.Monoid (Monoid(..))
4748import Data.Ratio (Ratio)
4849import Data.Text (Text, pack, unpack)
4950import Data.Text.Encoding (decodeUtf8, encodeUtf8)
5051import Data.Time.Clock (UTCTime)
5152import Data.Time.Format (FormatTime, formatTime, parseTime)
52−import Data.Attoparsec.Char8 (Number(..))
5353import Data.Typeable (Typeable)
5454import Data.Vector (Vector)
5555import Data.Word (Word, Word8, Word16, Word32, Word64)
5656import System.Locale (defaultTimeLocale)
5757import qualified Data.ByteString as B
5858import qualified Data.ByteString.Lazy as LB
59+import qualified Data.HashMap.Strict as H
60+import qualified Data.IntSet as IntSet
5961import qualified Data.Map as M
6062import qualified Data.Set as Set
6163import qualified Data.Text as T
6264import qualified Data.Text.Lazy as LT
6365import qualified Data.Vector as V
64−import Data.Aeson.Functions
6566
6667-- | The result of running a 'Parser'.
6768data Result a = Error String
@@ -526,6 +527,29 @@ instance (ToJSON v) => ToJSON (M.Map String v) where
526527instance (FromJSON v) => FromJSON (M.Map String v) where
527528 parseJSON = fmap (M.mapKeysMonotonic unpack) . parseJSON
528529
530+instance (ToJSON v) => ToJSON (H.HashMap Text v) where
531+ toJSON = Object . hashMap id toJSON
532+ {-# INLINE toJSON #-}
533+
534+instance (FromJSON v) => FromJSON (H.HashMap Text v) where
535+ parseJSON (Object o) = H.fromList <$> go (M.toList o)
536+ where
537+ go ((k,v):kvs) = ((:) . (,) k) <$> parseJSON v <*> go kvs
538+ go _ = pure []
539+ parseJSON _ = empty
540+
541+instance (ToJSON v) => ToJSON (H.HashMap LT.Text v) where
542+ toJSON = Object . M.fromList . H.foldrWithKey (\k v -> ((LT.toStrict k,toJSON v) :)) []
543+
544+instance (FromJSON v) => FromJSON (H.HashMap LT.Text v) where
545+ parseJSON = fmap (mapHash LT.fromStrict) . parseJSON
546+
547+instance (ToJSON v) => ToJSON (H.HashMap String v) where
548+ toJSON = Object . hashMap pack toJSON
549+
550+instance (FromJSON v) => FromJSON (H.HashMap String v) where
551+ parseJSON = fmap (mapHash unpack) . parseJSON
552+
529553instance ToJSON Value where
530554 toJSON a = a
531555 {-# INLINE toJSON #-}