json – Aeson和Lens与DeriveGeneric和makeLenses – 名称不排队

前端之家收集整理的这篇文章主要介绍了json – Aeson和Lens与DeriveGeneric和makeLenses – 名称不排队前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_0@
假设我有一个类型的人
  1. import GHC.Generics
  2. import Data.Text
  3. import Data.Aeson
  4. import Control.Lens
  5.  
  6. data Person = Person {
  7. _firstName :: Text,_lastName :: Text,_age :: Int
  8. } deriving (Show,Generic)

我想自动为它导出镜头和JSON类型类

  1. makeLenses ''Person
  2. instance FromJSON Person
  3. instance ToJSON Person

这可以正常工作,但是DeriveGeneric将我的字段名称视为具有下划线并且期望我的JSON相应地格式化.

  1. { "_firstName": "James" ... etc} -- The underscore doesn't belong here.

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

理想情况下,我希望能够做到的是这样的事情

  1. let person = decode blob
  2. let name = person ^. firstName

即我希望能够导出镜头和JSON实例,所有字段名称都正确排列在我正在消耗的JSON-REST Api中的值,而无需编写太多样板文件.

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

解决方法

镜头和aeson都具有允许自定义处理字段和构造函数名称功能.由于aeson的默认设置不是您想要的,如果您希望镜头名称与JSON字段名称相同,则无论如何都不会工作,让我们更改aeson配置:
  1. {-# LANGUAGE DeriveGeneric #-}
  2. {-# LANGUAGE TemplateHaskell #-}
  3.  
  4. import GHC.Generics
  5. import Data.Text hiding (drop)
  6. import Data.Aeson
  7. import Data.Aeson.TH
  8. import Data.Aeson.Types
  9. import Control.Lens
  10.  
  11. data Person = Person {
  12. _firstName :: Text,Generic)
  13.  
  14. makeLenses ''Person
  15.  
  16. deriveJSON defaultOptions{fieldLabelModifier = drop 1} ''Person
  17.  
  18. {- alternative Generic version
  19. instance FromJSON Person where
  20. parseJSON = genericParseJSON defaultOptions{fieldLabelModifier = drop 1}
  21. instance ToJSON Person where
  22. toJSON = genericToJSON defaultOptions{fieldLabelModifier = drop 1}
  23. -}

对于镜头,相应的可配置功能makeLensesWith.

猜你在找的JavaScript相关文章