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)

haskell处理JSON(aeson)的更多相关文章

  1. Haskell语言学习笔记(66)Aeson

    Data.Aeson 安装 aeson $ cabal install aeson Installed aeson-1.2.3.0 Prelude> :m +Data.Aeson Prelude ...

  2. Haskell Json数据处理

    json的基本类型为——string, numbers, Booleans以及null,定义json类型如下 -- file: Json.hs module Json where data JValu ...

  3. ios项目里扒出来的json文件

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  4. JSON Editor 中文文档

    JSON Editor JSON Editor 根据定义的JSON Schema 生成了一个Html 表单来对JSON进行编辑.它完整支持JSON Schema 的版本3和版本4,并且它集成了一些流行 ...

  5. .Net使用JsonSchema验证Json

    最近项目中遇到了这样的需求,需要对上传的Json进行验证,以确保Json数据的准确性.前后使用了两种方式来验证: (1)第一种方式的实现思想:根据Json数据的格式,严格定义相应的类结构,并在Syst ...

  6. JSON Web Tokens(JWT)

    现在API越来越流行,如何安全保护这些API? JSON Web Tokens(JWT)能提供基于JSON格式的安全认证.它有以下特点: JWT是跨不同语言的,JWT可以在 .NET, Python, ...

  7. 你所不知道的JSON.stringify

    译者按: 老司机们,你知道JSON.stringify还有第二个和第三个可选参数吗?它们是什么呢? 原文: What you didn’t know about JSON.Stringify 译者: ...

  8. Haskell语言学习笔记(80)req

    req req 是一个好用,类型安全,可扩展,上层的HTTP客户端的库. $ cabal install req Installed req-1.1.0 Prelude> :m +Network ...

  9. 你所不知道的JSON

    译者按: 老司机们,你知道JSON.stringify还有第二个和第三个可选参数吗?它们是什么呢? JSON已经逐渐替代XML被全世界的开发者广泛使用.本文深入讲解JavaScript中使用JSON. ...

随机推荐

  1. SGU495 概率DP

    Kids and Prizes ICPC (International Cardboard Producing Company) is in the business of producing car ...

  2. 不同级域名中的 Cookie 共享

    HTTP 响应头中 Set-Cookie 行未指定 domain 时则设置访问的域名 seliote.com 可以设置 seliote.com(也可以写成 .seliote.com 意思一样) 与 w ...

  3. OpenCV学习笔记(十一) 轮廓操作

    在图像中寻找轮廓 首先利用Canny算子检测图像的边缘,再利用Canny算子的输出作为 寻找轮廓函数 findContours 的输入.最后用函数 drawContours 画出轮廓.边界Counto ...

  4. Lambda与LINQ

    Lambda与LINQ写法对比: 上为Lambda 下为LINQ 显示指定列 Students.select(u=>(new {Name=u.Sname,Address=u.Saddress}) ...

  5. 如何使用malloc申请一个二位数组

    fscanf(file, "%d", &iVertexNum); // Read number of Vertices double **G = (double **)ma ...

  6. DOS程序员手册(四)

    5.4打印机功能 打印机是能够直接控制的输出设备之外的唯一的重要输出设备.它们的功能比屏幕 107页 功能要简单得多,因为它们只涉及字符输出,并最小程度地与打印机的输入有关. 输出给打印机的最简单的方 ...

  7. python中subprocess.Popen执行命令并持续获取返回值

    先举一个Android查询连接设备的命令来看看Python中subprocess.Popen怎么样的写法.用到的命令为 adb devices. import subprocess order='ad ...

  8. Python 3基础教程15-读文件内容

    前面两篇关于写文件和更新文件内容,我们最后都是手动去打开检查是否更新了.现在我们这里通过函数读取之前文件内容,打印到屏幕终端. 运行结果:

  9. win10 64位 C# 连接oracle 32位, 遇到的问题及解决

    首次 本机电脑是win10系统 64位的:安装的oracle数据库也是64位的: 服务器端的oracle 是32位的: 第一次安装的pl/sql 也是64位的, 配置完  F:\app\ln_qi\p ...

  10. 一步步精通NodeJs的简单实例

    一步一步完成nodejs+express+mysql的简单实例开发 1.使用express创建简单web服务器 项目文件下安装express,这个不多说,很简单,直接在项目目录下运行 npm inst ...