@@ -21,24 +21,21 @@ import qualified Data.Attoparsec as A
22json :: Parser Value
22json :: Parser Value
25− c <- anyChar
24+ c <- skipSpace *> anyChar
27− '{' -> skipSpace *> object
26+ '{' -> skipSpace *> object_
28− '[' -> skipSpace *> array
27+ '[' -> skipSpace *> array_
29 _ -> fail "root value is not an object or array"
28 _ -> fail "root value is not an object or array"
31−object :: Parser Value
30+object_ :: Parser Value
32−object = do
31+object_ = do
33 let pair = liftA2 (,) (jstring <* skipSpace) (char8 ':' *> skipSpace *> value)
32 let pair = liftA2 (,) (jstring <* skipSpace) (char8 ':' *> skipSpace *> value)
34− vals <- (pair <* skipSpace) `sepBy` (char8 ',' *> skipSpace)
33+ vals <- ((pair <* skipSpace) `sepBy` (char8 ',' *> skipSpace)) <* char8 '}'
36 return . Object $ Map.fromList vals
34 return . Object $ Map.fromList vals
38−array :: Parser Value
36+array_ :: Parser Value
39−array = do
37+array_ = do
40− vals <- (value <* skipSpace) `sepBy` (char8 ',' *> skipSpace)
38+ vals <- ((value <* skipSpace) `sepBy` (char8 ',' *> skipSpace)) <* char8 ']'
42 return . Array $ Vector.fromList vals
39 return . Array $ Vector.fromList vals
44value :: Parser Value
41value :: Parser Value
@@ -47,8 +44,8 @@ value = most <|> (Number <$> double)
48 c <- anyChar
45 c <- anyChar
50− '{' -> skipSpace *> object
47+ '{' -> skipSpace *> object_
51− '[' -> skipSpace *> array
48+ '[' -> skipSpace *> array_
52 '"' -> String <$> jstring_
49 '"' -> String <$> jstring_
53 'f' -> string "alse" *> pure (Bool False)
50 'f' -> string "alse" *> pure (Bool False)
54 't' -> string "rue" *> pure (Bool True)
51 't' -> string "rue" *> pure (Bool True)