Already is night, so post will be short :) This is an example how to parse JSON data (date stamp) in free format:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Control.Monad (mzero)
import Data.Aeson
import qualified Data.ByteString.Lazy as B
import Data.Text
import Data.Time
import Data.Maybe (fromJust)
main :: IO ()
main = getJSON >>= print
data Person =
Person { name :: !Text
, age :: Int
, birth :: UTCTime
} deriving Show
prsTime :: String -> UTCTime
prsTime = fromJust . parseTimeM True defaultTimeLocale "%0Y,%m"
instance FromJSON Person where
parseJSON (Object v) =
Person <$> v .: "name"
<*> v .: "age"
<*> (prsTime <$> v .: "birth")
parseJSON _ = mzero
jsonFile :: FilePath
jsonFile = "js.json"
getJSON :: IO (Maybe Person)
getJSON = decode <$> B.readFile jsonFile
To build I change .cabal file to:
...
build-depends: base
, js
, text
, aeson
, bytestring >= 0.10
, time
...
Our testing JSON file D:\prj\js\js.json
will be:
{
"name": "alex",
"age": 20,
"birth": "2017,10"
}
so, as you can see our date has format "YYYY,mm". Build and run as usual:
D:\prj\js> stack build
D:\prj\js> stack exec js-exe
Just (Person {name = "alex", age = 20, birth = 2017-10-01 00:00:00 UTC})