gpt4 book ai didi

json - Aeson 和 Lens 与 DeriveGeneric 和 makeLenses - 名称不对齐

转载 作者:行者123 更新时间:2023-12-04 10:50:01 25 4
gpt4 key购买 nike

假设我有一个类型 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)

我想为它自动派生 Lenses 和 JSON 类型类
makeLenses ''Person
instance FromJSON Person
instance ToJSON Person

这可以正常工作,但是 DeriveGeneric 将我的字段名称视为带有下划线,并希望我的 JSON 被相应地格式化。
{ "_firstName": "James" ... etc} -- The underscore doesn't belong here.

显然我可以从 data 中删除下划线。定义本身,然后是 makeLenses将无法派生所需的 getter 和 setter。

理想情况下,我想做的是这样的
let person = decode blob
let name = person ^. firstName

即,我希望能够派生所有字段名称与我正在使用的 JSON-REST Api 中的值正确对齐的镜头和 JSON 实例,而无需编写太多样板文件。

这似乎是一件直截了当的事情,我觉得我错过了一些明显的东西?

最佳答案

两个lensaeson具有允许自定义处理字段和构造函数名称的功能。由于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}
-}

对于 lens ,对应的可配置函数为 makeLensesWith .

关于json - Aeson 和 Lens 与 DeriveGeneric 和 makeLenses - 名称不对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28123867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com