Haskell, Aeson & JSON parsing into custom type

后端 未结 3 1924
春和景丽
春和景丽 2021-01-02 01:26

Following on from a previous post, I\'ve found I\'m totally stuck. I\'m trying to parse a JSON structure into my own type, and not only am I stuck on how to parse the Array,

3条回答
  •  遥遥无期
    2021-01-02 02:06

    I'm not native english speaker, so i may not understand you very well. I guess you want to know how to parse json into recursive data type like ExifValue you presented. So i made a simple example to show how to parse json into recursive data type.

    {-# LANGUAGE OverloadedStrings #-}
    import qualified Data.ByteString as B
    import Data.Maybe
    import Control.Monad
    import Control.Applicative
    import Data.Attoparsec
    import Data.Attoparsec.Number
    import Data.Aeson
    import qualified Data.Vector as V
    
    data Data = D1 Int | D2 [Data]
        deriving (Show)
    
    instance FromJSON Data where
        parseJSON (Number (I n)) = return $ D1 $ fromInteger n
        parseJSON (Array a)    = D2 <$> mapM parseJSON (V.toList a)
    
    main = do
        let v = fromJust $ maybeResult $ parse json "[1,2,3,[5,3,[6,3,5]]]"
        let v1 :: Data
            v1 = case fromJSON v of
                     Success a -> a
                     Error s   -> error s
        print v1
    

提交回复
热议问题