使用新类型的内部类型的实例自动派生 toJSON/fromJSON
Automatically deriving toJSON/fromJSON using the instances of the inner type of a newtype
在我的代码中,我使用了很多 newtype
声明,例如:
newtype PersonName = PersonName { personName :: Text }
newtype PetName = PetName { petName :: Text }
(实际上我使用 lenses 来避免访问器函数的繁琐名称。)
但是,如果我从 ToJSON
和 FromJSON
自动派生实例,则结果 JSON 的形式为:
{ "personName": "The person name" }
{ "petName": "The pet name" }
有没有一种方法可以避免为上面的 newtype
声明 ToJSON
和 FromJSON
的简单实例的样板,这样得到的 JSON 对象将采用以下形式:
"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)
您可以使用 GeneralizedNewtypeDeriving
派生实例。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype PersonName = PersonName { personName :: Text }
deriving (ToJSON, FromJSON)
在我的代码中,我使用了很多 newtype
声明,例如:
newtype PersonName = PersonName { personName :: Text }
newtype PetName = PetName { petName :: Text }
(实际上我使用 lenses 来避免访问器函数的繁琐名称。)
但是,如果我从 ToJSON
和 FromJSON
自动派生实例,则结果 JSON 的形式为:
{ "personName": "The person name" }
{ "petName": "The pet name" }
有没有一种方法可以避免为上面的 newtype
声明 ToJSON
和 FromJSON
的简单实例的样板,这样得到的 JSON 对象将采用以下形式:
"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)
您可以使用 GeneralizedNewtypeDeriving
派生实例。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype PersonName = PersonName { personName :: Text }
deriving (ToJSON, FromJSON)