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)
  • 相关阅读:
    java在线预览txt、word、ppt、execel,pdf代码
    java读写文本文件大全
    经典SQL语句大全
    javascript和jQuery知识点总结
    30条经典的SQL语句
    js 树菜单
    一天一记
    笔记本驱动的安装事项[acer]
    拒绝买房的八大理由
    javascript 常用类
  • 原文地址:https://www.cnblogs.com/x1957/p/3173075.html
Copyright © 2011-2022 走看看