gpt4 book ai didi

haskell - 在 Haskell 的 Aeson 中省略 Nothing/null 字段

转载 作者:行者123 更新时间:2023-12-04 22:55:52 25 4
gpt4 key购买 nike

我有一个类型

{-# LANGUAGE DeriveGeneric   #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiWayIf #-}

import GHC.Generics
import Data.Aeson.TH
import Data.Aeson.Types

data MyJSONObject = MyJSONObject
{ name :: String
, ptype :: Maybe String
, pid :: Maybe String
, subject :: Maybe String
, message :: Maybe String
} deriving (Show, Generic)

还有更多 Maybe String字段。我的 FromJSONToJSONTemplateHaskell 提供功能
$(deriveJSON defaultOptions
{
omitNothingFields = True
, fieldLabelModifier = \f -> if
| f == "ptype" -> "type" -- reserved keyword
| f == "pid" -> "id" -- Prelude function name
| otherwise -> f
} ''MyJSONObject)

最终,程序的输出是一个 JSON 文档,旨在由不允许某些字段具有空值的应用程序使用,即使它确实允许这些字段不存在。换句话说, subject 完全没问题不存在于 JSON 文档中,但如果确实存在,则其值不能为 null。我的期望是 omitNothingFields将处理此要求,但情况似乎并非如此: decode d JSON 仍然有 Nothing不存在的字段的值,以及 encode d JSON 有 null这些字段的值。前一种情况很好;后一种情况不是,因此是问题所在。

我是否误用或误解了 omitNothingFields 的目的? ?如何忽略带有 Nothing 的字段/ null值(value)观?

最佳答案

为我工作。尝试使用泛型派生而不是 TH。也许就是这样做的。

*Main Data.Aeson> decode "{\"name\":\"str\"}" :: Maybe MyJSONObject
Just (MyJSONObject {name = "str", ptype = Nothing, pid = Nothing, subject = Nothing, message = Nothing})
*Main Data.Aeson> encode (MyJSONObject "str" Nothing Nothing Nothing Nothing)
"{\"name\":\"str\"}"

完整的代码是
{-# LANGUAGE DeriveGeneric   #-}
import GHC.Generics
import Data.Aeson
import Data.Aeson.Types

data MyJSONObject = MyJSONObject
{ name :: String
, ptype :: Maybe String
, pid :: Maybe String
, subject :: Maybe String
, message :: Maybe String
} deriving (Show, Generic)

instance ToJSON MyJSONObject where
toJSON = genericToJSON defaultOptions
{ omitNothingFields = True }

instance FromJSON MyJSONObject where
parseJSON = genericParseJSON defaultOptions
{ omitNothingFields = True }

使用 GHC 8.2.1, aeson-1.1.2.0 .

关于haskell - 在 Haskell 的 Aeson 中省略 Nothing/null 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47100569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com