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)

最新文章

  1. BZOJ 1006 【HNOI2008】 神奇的国度
  2. Maven 实战
  3. 新版macbook air OS X El Capitan 10.11安装WIN找不到驱动介质???
  4. Hash(LCP) || 后缀数组 LA 4513 Stammering Aliens
  5. SSH三大框架的工作原理及流程
  6. UnityShader快速上手指南(三)
  7. VS2008+Qt+助手 智能提示不显示、Qt关键字不高亮的解决办法【已解决】
  8. 【Git 】$ ./gradlew idea 构建一个idea的项目
  9. Central Europe Regional Contest 2012 Problem J: Conservation
  10. 射频识别技术漫谈(24)——ISO15693的防冲突与传输协议
  11. socket网络编程快速上手(二)——细节问题(1)
  12. 搭建后台页面布局利用属性target 属性
  13. opencl 和Renderscript总结
  14. 从零开始学习前端JAVASCRIPT — 3、JavaScript基础string字符串介绍
  15. CoreJava(一)—— Java迭代语句
  16. 34对MyBatis的博客的整理心得
  17. 第三次实验计算分段函数 第四次计算分段函数和循环NEW 第五次分支+循环加强版 实验报告
  18. zk实现分布式锁
  19. jquery 如何获取有多个class名的元素
  20. DOM增删操作(select动态增加和删除以及清空)

热门文章

  1. PAT (Basic Level) Practice 1006 换个格式输出整数
  2. centos安装Linux
  3. scrapy如何实现分布式爬虫
  4. ArrayList &amp; Vector的源码实现
  5. java实时监听日志写入kafka
  6. cocos2d-x 3.0 导演,场景,层,精灵
  7. 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Huffman编码
  8. 《Cracking the Coding Interview》——第16章:线程与锁——题目6
  9. MQ消息中间件
  10. Entity Framework(二)