4

我有以下问题,我有一个带有可选键的 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,Aeson 使键在编码中可选的方法是什么

编辑,编码示例

encode $ Person "windwarrior" Nothing "green" Nothing

应该导致

{"name":"windwarrior", "favoriteColor":"green"}
4

2 回答 2

8

用于TemplateHaskell派生ToJSON实例而不是Generic. TH 函数可选地采用Options具有选项的omitNothingFields选项。

于 2013-10-29T18:20:23.240 回答
2

也有Options带有omitNothingFields字段的数据类型,Generics因此您不必使用TemplateHaskell,但是目前存在 ( v0.11.2.0)一个错误,使其在某些情况下生成无效的 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]
于 2016-06-20T00:22:20.140 回答