2

I have this:

data Data1 = Data1 { field1 :: Int, field2 :: Int }
data DataMain = DataMain 
    { a :: String 
    , b :: Bool
    , subData :: Data1
    }

And JSON

{
    a: 'some value',
    b: 'some value2',
    c: 'some value3',
    d: 'some value4',
}

And here are the

  instance ToJSON DataMain where
  toJSON (DataMain a b subData) =
    object ["a" .= a
      , "b" .= b
      , "c" .= (field1 subData)
      , "d" .= (field2 subData)
    ]

How can I do the same thing vise versa?

instance FromJSON DataMain where
  parseJSON (Object v) =
    DataMain <$> v .: "a"
        <*> v .: "b"
        <*> v .: ?????

  parseJSON _ = mzero

1 Answer 1

6

You can use the same applicative notation to parse the nested values like this:

instance FromJSON DataMain where
    parseJSON (Object v) =
        DataMain <$> v .: "a"
                 <*> v .: "b"
                 <*> (Data1 <$> v .: "c" <*> v .: "d")

    parseJSON _ = mzero
Sign up to request clarification or add additional context in comments.

2 Comments

by the way, if field1 and field2 were UTCTime, how could I parse it? I tried Data1 <$> ((read $ v .: "field1")::UTCTime) ... but failed.
Declaring them as UTCTime like: data Data1 = Data1 { field1 :: UTCTime, field2 :: UTCTime } should make the trick.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.