Jam*_*ies 7 json haskell aeson haskell-lens
假设我有一个类型 Person
import GHC.Generics
import Data.Text
import Data.Aeson
import Control.Lens
data Person = Person {
_firstName :: Text,
_lastName :: Text,
_age :: Int
} deriving (Show, Generic)
Run Code Online (Sandbox Code Playgroud)
我想自动为它导出镜头和JSON类型类
makeLenses ''Person
instance FromJSON Person
instance ToJSON Person
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但是DeriveGeneric将我的字段名称视为具有下划线并且期望我的JSON相应地格式化.
{ "_firstName": "James" ... etc} -- The underscore doesn't belong here.
Run Code Online (Sandbox Code Playgroud)
显然我可以从data定义本身中删除下划线,但是后来makeLenses无法派生所需的getter和setter.
理想情况下,我希望能够做到的是这样的事情
let person = decode blob
let name = person ^. firstName
Run Code Online (Sandbox Code Playgroud)
即我希望能够导出镜头和JSON实例,所有字段名称都正确排列在我正在消耗的JSON-REST Api中的值,而无需编写太多样板文件.
这似乎是一件很直接的事情,我觉得我错过了一些明显的东西?
Ørj*_*sen 11
这两个lens和aeson拥有的功能,让场和构造函数名的自定义操作.由于aeson默认不是您想要的,如果您希望镜头名称与JSON字段名称相同,则无论如何都不会工作,让我们更改aeson配置:
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TemplateHaskell #-}
import GHC.Generics
import Data.Text hiding (drop)
import Data.Aeson
import Data.Aeson.TH
import Data.Aeson.Types
import Control.Lens
data Person = Person {
_firstName :: Text,
_lastName :: Text,
_age :: Int
} deriving (Show, Generic)
makeLenses ''Person
deriveJSON defaultOptions{fieldLabelModifier = drop 1} ''Person
{- alternative Generic version
instance FromJSON Person where
parseJSON = genericParseJSON defaultOptions{fieldLabelModifier = drop 1}
instance ToJSON Person where
toJSON = genericToJSON defaultOptions{fieldLabelModifier = drop 1}
-}
Run Code Online (Sandbox Code Playgroud)
对于lens,相应的可配置功能将是makeLensesWith.
| 归档时间: |
|
| 查看次数: |
631 次 |
| 最近记录: |