我有以下问题,我有一个带有可选键的JSON格式,我需要从我的haskell代码生成。
让我们举个例子
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
import Data.Aeson
data Person = {
name :: String,
shoeSize :: Maybe Int,
favoriteColor :: Maybe String,
favoriteFood :: Maybe StringC
} deriving (show, eq, generic)
instance ToJSON Person -- Generic instance
现在,如果我尝试在没有鞋子的情况下对一个人进行编码,我仍然会将一个“shoeSize”键设置为null,那么在编码
编辑,编码的例子
encode $ Person "windwarrior" Nothing "green" Nothing
应该导致
{"name":"windwarrior", "favoriteColor":"green"}
答案 0 :(得分:8)
使用TemplateHaskell
派生ToJSON
个实例,而不是Generic
。 TH函数可选择使用具有omitNothingFields
选项的Options
。
答案 1 :(得分:2)
Options
数据类型带有omitNothingFields
Generics
字段,因此您不必使用TemplateHaskell
,但目前还有v0.11.2.0
}} a bug使其在某些情况下生成无效的JSON,例如几个记录领域。它已修复但位于master
。
如果您愿意,也可以手写实例,例如:
instance ToJSON Person where
toJSON (Person name shoeSize favoriteColor favoriteFood) = object fields
where
consMay attr = maybe id ((:) . (attr .=))
conss = consMay "shoeSize" shoeSize
. consMay "favoriteColor" favoriteColor
. consMay "favoriteFood" favoriteFood
fields = conss ["name" .= name]