Skip to content

Commit b9da969

Browse files
authored
Merge pull request #577 from vlopezj/master
Add `FromJSON` and `ToJSON` instances for `DiffTime`
2 parents 475058c + 63cbc3b commit b9da969

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

Data/Aeson/Types/FromJSON.hs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ import Data.Ratio ((%), Ratio)
101101
import Data.Scientific (Scientific)
102102
import Data.Tagged (Tagged(..))
103103
import 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)
105105
import Data.Time.Format (parseTime)
106106
import Data.Time.Locale.Compat (defaultTimeLocale)
107107
import 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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ import Data.Ratio (Ratio, denominator, numerator)
8484
import Data.Scientific (Scientific)
8585
import Data.Tagged (Tagged(..))
8686
import 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)
8888
import Data.Time.Format (FormatTime, formatTime)
8989
import Data.Time.Locale.Compat (defaultTimeLocale)
9090
import Data.Vector (Vector)
@@ -1911,13 +1911,22 @@ stringEncoding = String
19111911
. E.encodingToLazyByteString
19121912
{-# INLINE stringEncoding #-}
19131913

1914+
19141915
instance ToJSON NominalDiffTime where
19151916
toJSON = Number . realToFrac
19161917
{-# INLINE toJSON #-}
19171918

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
For 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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import Data.Proxy (Proxy)
2727
import Data.Ratio (Ratio)
2828
import Data.Sequence (Seq)
2929
import Data.Tagged (Tagged)
30-
import Data.Time (Day, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
30+
import Data.Time (Day, DiffTime, LocalTime, NominalDiffTime, TimeOfDay, UTCTime, ZonedTime)
3131
import Data.Version (Version)
3232
import Encoders
3333
import Instances ()
@@ -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)

0 commit comments

Comments
 (0)