zoukankan      html  css  js  c++  java
  • haskell处理JSON(aeson)

    aeson是haskell的一个库,其实我也不太懂,不过大概是这样的:

     
    定义一个类型
     
    data Person =
      Person { firstName  :: String
             , lastName   :: String
             , age        :: Int
             , likesPizza :: Bool
               } deriving Show
     
    然后我们来实现FromJSON , ToJSON这两个class
     
    instance FromJSON Person where
    parseJSON (Object v) =
        Person <$> v .: "firstName"
               <*> v .: "lastName"
               <*> v .: "age"
               <*> v .: "likesPizza"
    parseJSON _ = mzero
    
    instance ToJSON Person where
    toJSON (Person firstName lastName age likesPizza) =
        object [ "firstName"  .= firstName
               , "lastName"   .= lastName
               , "age"        .= age
               , "likesPizza" .= likesPizza
                 ]
     
    不过呢,也不用都这么写,打开ghc的DeriveGeneric扩展,就可以让编译器帮我们自动生成了
     
    data Person =
      Person { firstName  :: String
             , lastName   :: String
             , age        :: Int
             , likesPizza :: Bool
               } deriving (Show , Generic)
     
    instance FromJSON Person
    instance ToJSON Person
     
    就这么简单!
     
    处理JSON为两个,encode和decode
    decode :: FromJSON a => ByteString -> Maybe a
    encode :: ToJSON a => a -> ByteString
     
    下面是一个完整的读取acmicpc.info提供的比赛的JSON的代码
    {-# LANGUAGE OverloadedStrings, DeriveGeneric #-}
    
    import Data.Aeson
    import Control.Applicative
    import Control.Monad
    import qualified Data.ByteString.Lazy as B
    import Network.HTTP.Conduit (simpleHttp)
    import Network.Socket (withSocketsDo)
    
    import Data.Map
    import GHC.Generics
    data Contest = 
      Contest{
        id :: String , 
        oj :: String ,
        link :: String ,
        name :: String ,
        start_time :: String ,
        week :: String , 
        access :: String
      } deriving (Show , Generic)
    
    instance FromJSON Contest
    instance ToJSON Contest
    
    
    jsonURL :: String
    jsonURL = "http://contests.acmicpc.info/contests.json"
    
    getJSON :: IO B.ByteString
    getJSON = withSocketsDo $ simpleHttp jsonURL
    
    main :: IO ()
    main = do
      d <- (eitherDecode <$> getJSON) :: IO (Either String [Contest])
      case d of
        Left err -> putStrLn err
        Right ps -> print ps
    

      

     
    - -基本都是抄的例子,不过要主意的是simpleHttp在windows下面要在前面加个withSocketsDo...不然会有一个10093的错误,说file not exists
    getAddrInfo: does not exist (error 10093)
  • 相关阅读:
    C#中使用My实现单例应用程序
    喝着啤酒学Python(2):第一个HelloWorld
    再读《精通css》04:盒模型和空白边叠加
    再读《精通css》07:圆角
    再读《精通css》08:阴影
    @ResponseBody 乱码
    再读《精通css》05:定位、浮动与清理
    关于javascript面向对象的一点思考
    再读《精通css》06:背景图片
    【求解释】关于第三方接口调用中安全的疑问
  • 原文地址:https://www.cnblogs.com/x1957/p/3173075.html
Copyright © 2011-2022 走看看