Haskell 使用newtype的内部类型的实例自动派生toJSON/fromJSON
在我的代码中,我使用了大量的Haskell 使用newtype的内部类型的实例自动派生toJSON/fromJSON,haskell,aeson,Haskell,Aeson,在我的代码中,我使用了大量的newtype声明,如: newtype PersonName = PersonName { personName :: Text } newtype PetName = PetName { petName :: Text } (实际上,我使用镜头来避免访问器函数的繁琐名称。) 但是,如果我自动从ToJSON和FromJSON派生实例,则生成的JSON的形式如下: { "personName": "The person name" } { "petName": "T
newtype
声明,如:
newtype PersonName = PersonName { personName :: Text }
newtype PetName = PetName { petName :: Text }
(实际上,我使用镜头来避免访问器函数的繁琐名称。)
但是,如果我自动从ToJSON
和FromJSON
派生实例,则生成的JSON的形式如下:
{ "personName": "The person name" }
{ "petName": "The pet name" }
"The person name"
"The pet name"
对于上面的newtype
s,有没有一种方法可以避免声明ToJSON
和FromJSON
的琐碎实例的样板文件,从而生成的JSON对象的形式如下:
{ "personName": "The person name" }
{ "petName": "The pet name" }
"The person name"
"The pet name"
使用
deriveJSON
时,我需要将选项unwrapUnaryRecords
设置为True
:
import Data.Aeson
import Data.Aeson.TH
import Data.Text (Text)
newtype PersonName = PersonName { personName :: Text }
$(deriveJSON (defaultOptions { unwrapUnaryRecords = True }) ''InstallationId)
您可以使用来派生实例
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype PersonName = PersonName { personName :: Text }
deriving (ToJSON, FromJSON)
这是否也会打开记录?否,
generalizednewtypedering
实例的工作方式与其基础类型完全相同。基本上,PersonName
是Text
Er的抽象同义词,我是说是的。我误解了“unwrap”的含义。可能值得一提的是新的派生策略扩展,如果该模块中也启用了DeriveAnyClass
,那么它可能值得使用。