zoukankan      html  css  js  c++  java
  • Haskell语言学习笔记(66)Aeson

    Data.Aeson

    安装 aeson

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

    Data.Aeson 是一个处理 JSON 数据的库。

    处理 AST

    Prelude Data.Aeson> decode "{"foo": 123}" :: Maybe Value
    Just (Object (fromList [("foo",Number 123.0)]))
    Prelude Data.Aeson> decode "{"foo": ["abc","def"]}" :: Maybe Value
    Just (Object (fromList [("foo",Array [String "abc",String "def"])]))
    Prelude Data.Aeson> decode "[1,2,3]" :: Maybe [Int]
    Just [1,2,3]
    Prelude Data.Aeson> decode "{"foo":1,"bar":2}" :: Maybe (Data.Map.Map String Int)
    Just (fromList [("bar",2),("foo",1)])
    

    处理 Person(1)

    {-# LANGUAGE DeriveGeneric #-}
    
    import GHC.Generics
    import Data.Aeson
    import Data.Text
    
    data Person = Person {
          name :: Text
        , age  :: Int
        } deriving (Generic, Show)
    
    data Persons = Persons {
          persons :: [Person]
        } deriving (Generic, Show)
    
    instance ToJSON Person
    instance FromJSON Person
    
    instance ToJSON Persons
    instance FromJSON Persons
    
    *Main> :set -XOverloadedStrings
    *Main> encode (Person {name = "Joe", age = 12})
    "{"name":"Joe","age":12}"
    *Main> decode "{"name":"Joe","age":12}" :: Maybe Person
    Just (Person {name = "Joe", age = 12})
    *Main> encode (Persons {persons = [Person {name = "Joe", age = 12}]})
    "{"persons":[{"name":"Joe","age":12}]}"
    *Main> decode "{"persons":[{"name":"Joe","age":12}]}" :: Maybe Persons
    Just (Persons {persons = [Person {name = "Joe", age = 12}]})
    
    • instance ToJSON Persons
      要将 Persons 类型的对象序列化成 JSON 字符串,Persons 类型必须是 ToJSON 类型类的实例
    • instance FromJSON Persons
      要将 JSON 字符串反序列化成 Persons 类型的对象,Persons 类型必须是 FromJSON 类型类的实例

    处理 Person(2)

    {-# LANGUAGE OverloadedStrings #-}
    
    import Data.Aeson
    import Data.Text
    
    data Person = Person {
          name :: Text
        , age  :: Int
        } deriving Show
    
    data Persons = Persons {
          persons :: [Person]
        } deriving Show
    
    instance FromJSON Person where
        parseJSON = withObject "Person" $ v -> Person
            <$> v .: "name"
            <*> v .: "age"
    
    instance ToJSON Person where
        toJSON (Person name age) =
            object ["name" .= name, "age" .= age]
    
    instance FromJSON Persons where
        parseJSON = withObject "Persons" $ v -> Persons
            <$> v .: "persons"
    
    instance ToJSON Persons where
        toJSON (Persons persons) =
            object ["persons" .= persons]
    
    *Main> :set -XOverloadedStrings
    *Main> encode (Person {name = "Joe", age = 12})
    "{"name":"Joe","age":12}"
    *Main> decode "{"name":"Joe","age":12}" :: Maybe Person
    Just (Person {name = "Joe", age = 12})
    *Main> encode (Persons {persons = [Person {name = "Joe", age = 12}]})
    "{"persons":[{"name":"Joe","age":12}]}"
    *Main> decode "{"persons":[{"name":"Joe","age":12}]}" :: Maybe Persons
    Just (Persons {persons = [Person {name = "Joe", age = 12}]})
    

    处理 Person(3)

    {-# LANGUAGE OverloadedStrings #-}
    
    import Data.Aeson
    import Data.Text
    
    data Person = Person {
          name :: Text
        , age  :: Int
        } deriving Show
    
    instance FromJSON Person where
        parseJSON = withObject "Person" $ v -> Person
            <$> v .: "name"
            <*> v .:? "age" .!= 20
    
    *Main> :set -XOverloadedStrings
    *Main> decode "{"name":"Joe"}" :: Maybe Person
    Just (Person {name = "Joe", age = 20})
    

    处理 Person(4)

    {-# LANGUAGE DeriveGeneric #-}
    
    import GHC.Generics
    import Data.Aeson
    import Data.Text (Text)
    
    data Person = Person {
          field_NAME :: Text
        , field_AGE  :: Int
        } deriving (Generic, Show)
    
    customOptions = defaultOptions
                    { fieldLabelModifier = drop $ length ("field_" :: String)
                    }
    
    instance ToJSON Person where
        toJSON = genericToJSON customOptions
    instance FromJSON Person where
        parseJSON = genericParseJSON customOptions
    
    *Main> :set -XOverloadedStrings
    *Main> encode (Person {field_NAME = "Joe", field_AGE = 12})
    "{"AGE":12,"NAME":"Joe"}"
    *Main> decode "{"NAME":"Joe","AGE":12}" :: Maybe Person
    Just (Person {field_NAME = "Joe", field_AGE = 12})
    
  • 相关阅读:
    榫卯游戏介绍
    如果你有一个域名,你也可以免费有一个diy@yourdomain.com的企业邮局
    封装一个axios请求后台的通用方法
    javascript判断两个对象属性以及值是否相等
    遍历出文档内所有元素的tagName
    windows下nginx的安装及使用方法入门
    css样式重置样式
    canvas绘图
    表单脚本
    javascript事件
  • 原文地址:https://www.cnblogs.com/zwvista/p/8053819.html
Copyright © 2011-2022 走看看