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
,那么它可能值得使用。