haskell处理JSON(aeson)
2024-09-06 17:41:18
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)
最新文章
- BZOJ 1006 【HNOI2008】 神奇的国度
- Maven 实战
- 新版macbook air OS X El Capitan 10.11安装WIN找不到驱动介质???
- Hash(LCP) || 后缀数组 LA 4513 Stammering Aliens
- SSH三大框架的工作原理及流程
- UnityShader快速上手指南(三)
- VS2008+Qt+助手 智能提示不显示、Qt关键字不高亮的解决办法【已解决】
- 【Git 】$ ./gradlew idea 构建一个idea的项目
- Central Europe Regional Contest 2012 Problem J: Conservation
- 射频识别技术漫谈(24)——ISO15693的防冲突与传输协议
- socket网络编程快速上手(二)——细节问题(1)
- 搭建后台页面布局利用属性target 属性
- opencl 和Renderscript总结
- 从零开始学习前端JAVASCRIPT — 3、JavaScript基础string字符串介绍
- CoreJava(一)—— Java迭代语句
- 34对MyBatis的博客的整理心得
- 第三次实验计算分段函数 第四次计算分段函数和循环NEW 第五次分支+循环加强版 实验报告
- zk实现分布式锁
- jquery 如何获取有多个class名的元素
- DOM增删操作(select动态增加和删除以及清空)
热门文章
- PAT (Basic Level) Practice 1006 换个格式输出整数
- centos安装Linux
- scrapy如何实现分布式爬虫
- ArrayList &; Vector的源码实现
- java实时监听日志写入kafka
- cocos2d-x 3.0 导演,场景,层,精灵
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Huffman编码
- 《Cracking the Coding Interview》——第16章:线程与锁——题目6
- MQ消息中间件
- Entity Framework(二)