假设我有一个类型的人
import GHC.Generics
import Data.Text
import Data.Aeson
import Control.Lens

data Person = Person {
    _firstName :: Text,_lastName  :: Text,_age       :: Int
} deriving (Show,Generic)

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

makeLenses ''Person
instance FromJSON Person
instance ToJSON Person

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

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

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

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

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

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

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

解决方法

镜头和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,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}
-}

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

json – Aeson和Lens与DeriveGeneric和makeLenses – 名称不排队的更多相关文章

  1. Android camera2 API在AF模式下获得焦距

    我正在使用Androidcamera2API.我可以在手动对焦模式下使用LENS_FOCUS_disTANCE获得焦距值.但是,AF模式下的属性始终为零.在AF模式下有没有办法获得焦距?解决方法Shortestdistancefromfrontmostsurfaceofthelensthatcanbebroughtintosharpfocus.Ifthelensisfixed-focus,this

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

    假设我有一个类型的人我想自动为它导出镜头和JSON类型类这可以正常工作,但是DeriveGeneric将我的字段名称视为具有下划线并且期望我的JSON相应地格式化.显然我可以从数据定义本身中删除下划线,但是makeLenses将无法派生所需的getter和setter.理想情况下,我希望能够做到的是这样的事情即我希望能够导出镜头和JSON实例,所有字段名称都正确排列在我正在消耗的JSON-RESTApi中的值,而无需编写太多样板文件.这似乎是一件很直接的事情,我觉得我错过了一些明显的东西?

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部