@@ -188,7 +188,7 @@ parseIntegralFromScientific :: forall a. Integral a => String -> Scientific -> P
188188parseIntegralFromScientific expected s =
189189 case Scientific.floatingOrInteger s :: Either Double a of
190190 Right x -> pure x
191− Left _ -> fail $ "Floating number specified for " ++ expected ++ ": " ++ show s
191+ Left _ -> fail $ "expected " ++ expected ++ ", encountered floating number " ++ show s
192192{-# INLINE parseIntegralFromScientific #-}
193193
194194parseIntegral :: Integral a => String -> Value -> Parser a
@@ -1273,16 +1273,20 @@ instance FromJSONKey Integer where
12731273 fromJSONKey = FromJSONKeyTextParser $ parseIntegralText "Integer"
12741274
12751275instance FromJSON Natural where
1276− parseJSON = withScientific "Natural" $ \s ->
1277− if Scientific.coefficient s < 0
1278− then fail $ "Expected a Natural number but got the negative number: " <> show s
1279− else pure $ truncate s
1276+ parseJSON value = do
1277+ integer :: Integer <- parseIntegral "Natural" value
1278+ if integer < 0 then
1279+ fail $ "expected Natural, encountered negative number " <> show integer
1280+ else
1281+ pure $ fromIntegral integer
12801282
12811283instance FromJSONKey Natural where
1282− fromJSONKey = FromJSONKeyTextParser $ \t -> parseScientificText t >>= \s ->
1283− if Scientific.coefficient s < 0
1284− then fail $ "Expected a Natural number but got the negative number: " <> show s
1285− else pure $ truncate s
1284+ fromJSONKey = FromJSONKeyTextParser $ \text -> do
1285+ integer :: Integer <- parseIntegralText "Natural" text
1286+ if integer < 0 then
1287+ fail $ "expected Natural, encountered negative number " <> show integer
1288+ else
1289+ pure $ fromIntegral integer
12861290
12871291instance FromJSON Int8 where
12881292 parseJSON = parseBoundedIntegral "Int8"