@@ -36,32 +36,33 @@ module Data.Aeson.Types
38import Control.Applicative
38import Control.Applicative
39−import Control.Monad (MonadPlus(..))
40−import Data.Monoid (Monoid(..))
41import Control.DeepSeq (NFData(..))
39import Control.DeepSeq (NFData(..))
40+import Control.Monad (MonadPlus(..))
41+import Data.Aeson.Functions (hashMap, mapHash, transformMap)
42+import Data.Attoparsec.Char8 (Number(..))
42import Data.Data (Data)
43import Data.Data (Data)
43import Data.Int (Int8, Int16, Int32, Int64)
44import Data.Int (Int8, Int16, Int32, Int64)
44−import qualified Data.IntSet as IntSet
45import Data.Map (Map)
45import Data.Map (Map)
46import Data.Monoid (Dual(..), First(..), Last(..))
46import Data.Monoid (Dual(..), First(..), Last(..))
47+import Data.Monoid (Monoid(..))
47import Data.Ratio (Ratio)
48import Data.Ratio (Ratio)
48import Data.Text (Text, pack, unpack)
49import Data.Text (Text, pack, unpack)
49import Data.Text.Encoding (decodeUtf8, encodeUtf8)
50import Data.Text.Encoding (decodeUtf8, encodeUtf8)
50import Data.Time.Clock (UTCTime)
51import Data.Time.Clock (UTCTime)
51import Data.Time.Format (FormatTime, formatTime, parseTime)
52import Data.Time.Format (FormatTime, formatTime, parseTime)
52−import Data.Attoparsec.Char8 (Number(..))
53import Data.Typeable (Typeable)
53import Data.Typeable (Typeable)
54import Data.Vector (Vector)
54import Data.Vector (Vector)
55import Data.Word (Word, Word8, Word16, Word32, Word64)
55import Data.Word (Word, Word8, Word16, Word32, Word64)
56import System.Locale (defaultTimeLocale)
56import System.Locale (defaultTimeLocale)
57import qualified Data.ByteString as B
57import qualified Data.ByteString as B
58import qualified Data.ByteString.Lazy as LB
58import qualified Data.ByteString.Lazy as LB
59+import qualified Data.HashMap.Strict as H
60+import qualified Data.IntSet as IntSet
59import qualified Data.Map as M
61import qualified Data.Map as M
60import qualified Data.Set as Set
62import qualified Data.Set as Set
61import qualified Data.Text as T
63import qualified Data.Text as T
62import qualified Data.Text.Lazy as LT
64import qualified Data.Text.Lazy as LT
63import qualified Data.Vector as V
65import qualified Data.Vector as V
64−import Data.Aeson.Functions
66-- | The result of running a 'Parser'.
67-- | The result of running a 'Parser'.
67data Result a = Error String
68data Result a = Error String
@@ -526,6 +527,29 @@ instance (ToJSON v) => ToJSON (M.Map String v) where
526instance (FromJSON v) => FromJSON (M.Map String v) where
527instance (FromJSON v) => FromJSON (M.Map String v) where
527 parseJSON = fmap (M.mapKeysMonotonic unpack) . parseJSON
528 parseJSON = fmap (M.mapKeysMonotonic unpack) . parseJSON
530+instance (ToJSON v) => ToJSON (H.HashMap Text v) where
531+ toJSON = Object . hashMap id toJSON
532+ {-# INLINE toJSON #-}
534+instance (FromJSON v) => FromJSON (H.HashMap Text v) where
535+ parseJSON (Object o) = H.fromList <$> go (M.toList o)
537+ go ((k,v):kvs) = ((:) . (,) k) <$> parseJSON v <*> go kvs
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) :)) []
544+instance (FromJSON v) => FromJSON (H.HashMap LT.Text v) where
545+ parseJSON = fmap (mapHash LT.fromStrict) . parseJSON
547+instance (ToJSON v) => ToJSON (H.HashMap String v) where
548+ toJSON = Object . hashMap pack toJSON
550+instance (FromJSON v) => FromJSON (H.HashMap String v) where
551+ parseJSON = fmap (mapHash unpack) . parseJSON
529instance ToJSON Value where
553instance ToJSON Value where
530 toJSON a = a
554 toJSON a = a
531 {-# INLINE toJSON #-}
555 {-# INLINE toJSON #-}