Data.Aeson编码可选键

时间:2013-10-29 17:23:23

标签: json haskell aeson

我有以下问题,我有一个带有可选键的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"}

2 个答案:

答案 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]