on master help sign in
Add `FromJSON` and `ToJSON` instances for `DiffTime`
commit972a2af27d4af53b98eb03f689cd113b0682d835 authorVíctor López Juan <victor@lopezjuan.com> dateWed 23 Aug 2017, 12:06 (9 years ago) parent475058c
4 files changed+25−2
Data/Aeson/Types/FromJSON.hs+10−1 Data/Aeson/Types/ToJSON.hs+10−1 changelog.md+4 tests/Properties.hs+1
Data/Aeson/Types/FromJSON.hs+10−1
@@ -101,7 +101,7 @@ import Data.Ratio ((%), Ratio)
101101import Data.Scientific (Scientific)
102102import Data.Tagged (Tagged(..))
103103import Data.Text (Text, pack, unpack)
104−import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
104+import Data.Time (Day, DiffTime, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
105105import Data.Time.Format (parseTime)
106106import Data.Time.Locale.Compat (defaultTimeLocale)
107107import Data.Traversable as Tr (sequence)
@@ -1704,6 +1704,15 @@ instance FromJSON NominalDiffTime where
17041704 parseJSON = withScientific "NominalDiffTime" $ pure . realToFrac
17051705 {-# INLINE parseJSON #-}
17061706
1707+
1708+-- | /WARNING:/ Only parse lengths of time from trusted input
1709+-- since an attacker could easily fill up the memory of the target
1710+-- system by specifying a scientific number with a big exponent like
1711+-- @1e1000000000@.
1712+instance FromJSON DiffTime where
1713+ parseJSON = withScientific "DiffTime" $ pure . realToFrac
1714+ {-# INLINE parseJSON #-}
1715+
17071716-------------------------------------------------------------------------------
17081717-- base Monoid/Semigroup
17091718-------------------------------------------------------------------------------
Data/Aeson/Types/ToJSON.hs+10−1
@@ -84,7 +84,7 @@ import Data.Ratio (Ratio, denominator, numerator)
8484import Data.Scientific (Scientific)
8585import Data.Tagged (Tagged(..))
8686import Data.Text (Text, pack)
87−import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
87+import Data.Time (Day, DiffTime, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
8888import Data.Time.Format (FormatTime, formatTime)
8989import Data.Time.Locale.Compat (defaultTimeLocale)
9090import Data.Vector (Vector)
@@ -1911,6 +1911,7 @@ stringEncoding = String
19111911 . E.encodingToLazyByteString
19121912{-# INLINE stringEncoding #-}
19131913
1914+
19141915instance ToJSON NominalDiffTime where
19151916 toJSON = Number . realToFrac
19161917 {-# INLINE toJSON #-}
@@ -1918,6 +1919,14 @@ instance ToJSON NominalDiffTime where
19181919 toEncoding = E.scientific . realToFrac
19191920 {-# INLINE toEncoding #-}
19201921
1922+
1923+instance ToJSON DiffTime where
1924+ toJSON = Number . realToFrac
1925+ {-# INLINE toJSON #-}
1926+
1927+ toEncoding = E.scientific . realToFrac
1928+ {-# INLINE toEncoding #-}
1929+
19211930-------------------------------------------------------------------------------
19221931-- base Monoid/Semigroup
19231932-------------------------------------------------------------------------------
changelog.md+4
@@ -1,5 +1,9 @@
11For the latest version of this document, please see [https://github.com/bos/aeson/blob/master/changelog.md](https://github.com/bos/aeson/blob/master/changelog.md).
22
3+## Upcoming
4+
5+* Add `FromJSON` and `ToJSON` instances for `DiffTime`, thanks to Víctor López Juan
6+
37## 1.2.1.0
48
59* Add `parserThrowError` and `parserCatchError` combinators, thanks to Oleg Grenrus.
tests/Properties.hs+1
@@ -248,6 +248,7 @@ tests = testGroup "properties" [
248248 , testProperty "UTCTime" $ roundTripEq (undefined :: UTCTime)
249249 , testProperty "ZonedTime" $ roundTripEq (undefined :: ZonedTime)
250250 , testProperty "NominalDiffTime" $ roundTripEq (undefined :: NominalDiffTime)
251+ , testProperty "DiffTime" $ roundTripEq (undefined :: DiffTime)
251252 , testProperty "Version" $ roundTripEq (undefined :: Version)
252253 , testProperty "Natural" $ roundTripEq (undefined :: Natural)
253254 , testProperty "Proxy" $ roundTripEq (undefined :: Proxy Int)