@@ -41,9 +41,9 @@ import Data.ByteString.Lazy.Builder
41 (Builder, byteString, toLazyByteString, charUtf8, word8)
41 (Builder, byteString, toLazyByteString, charUtf8, word8)
44−import Control.Applicative ((*>), (<$>), (<*), (<|>), liftA2, pure)
44+import Control.Applicative ((*>), (<$>), (<*), liftA2, pure)
45import Data.Aeson.Types (Result(..), Value(..))
45import Data.Aeson.Types (Result(..), Value(..))
46−import Data.Attoparsec.Char8 (Parser, char, endOfInput, rational, satisfy,
46+import Data.Attoparsec.Char8 (Parser, char, endOfInput, rational,
47 skipSpace, string)
47 skipSpace, string)
48import Data.Bits ((.|.), shiftL)
48import Data.Bits ((.|.), shiftL)
49import Data.ByteString (ByteString)
49import Data.ByteString (ByteString)
@@ -57,7 +57,6 @@ import qualified Data.Attoparsec as A
57import qualified Data.Attoparsec.Lazy as L
57import qualified Data.Attoparsec.Lazy as L
58import qualified Data.Attoparsec.Zepto as Z
58import qualified Data.Attoparsec.Zepto as Z
59import qualified Data.ByteString as B
59import qualified Data.ByteString as B
60−import qualified Data.ByteString.Char8 as B8
61import qualified Data.ByteString.Lazy as L
60import qualified Data.ByteString.Lazy as L
62import qualified Data.ByteString.Unsafe as B
61import qualified Data.ByteString.Unsafe as B
63import qualified Data.HashMap.Strict as H
62import qualified Data.HashMap.Strict as H
@@ -179,23 +178,22 @@ value = do
180-- | Strict version of 'value'. See also 'json''.
179-- | Strict version of 'value'. See also 'json''.
181value' :: Parser Value
180value' :: Parser Value
182−value' = most <|> num
181+value' = do
183− where
182+ w <- A.peekWord8'
185− c <- satisfy (`B8.elem` "{[\"ftn")
186− case c of
183+ case w of
187− '{' -> object_'
184+ DOUBLE_QUOTE -> do
190− !s <- jstring_
185+ !s <- A.anyWord8 *> jstring_
191− return (String s)
186+ return (String s)
187+ OPEN_CURLY -> A.anyWord8 *> object_'
188+ OPEN_SQUARE -> A.anyWord8 *> array_'
192− 'f' -> string "alse" *> pure (Bool False)
189+ C_f -> string "false" *> pure (Bool False)
193− 't' -> string "rue" *> pure (Bool True)
190+ C_t -> string "true" *> pure (Bool True)
194− 'n' -> string "ull" *> pure Null
191+ C_n -> string "null" *> pure Null
195− _ -> error "attoparsec panic! the impossible happened!"
192+ _ | w >= 48 && w <= 57 || w == 45
197− !n <- rational
194+ !n <- rational
198− return (Number n)
195+ return (Number n)
196+ | otherwise -> fail "not a valid json value"
200-- | Parse a quoted JSON string.
198-- | Parse a quoted JSON string.
201jstring :: Parser Text
199jstring :: Parser Text