使用新类型的内部类型的实例自动派生 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 来避免访问器函数的繁琐名称。)

但是,如果我从 ToJSONFromJSON 自动派生实例,则结果 JSON 的形式为:

{ "personName": "The person name" }
{ "petName": "The pet name" }

有没有一种方法可以避免为上面的 newtype 声明 ToJSONFromJSON 的简单实例的样板,这样得到的 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)