Haskell & JSON - 处理 null

Haskell & JSON - dealing with null

我是 Haskell 的新手,一直在使用 Wreq 与 JSON API 进行交互。在将 JSON 响应提交回 API 之前,我尝试编辑它时遇到问题。我认为问题出在未定义的 Bool 上。

简而言之,ByteString 形式的 Wreq 响应体如下所示:

"{\"a\":1, \"b\":null}"

b 实际上是一个布尔值,但 API 响应将其保留为 null。我正在尝试使用 Lens 功能对其进行编辑,但没有成功。该问题很容易在 GHCI 中重现:

> import qualified Data.ByteString.Lazy as LB
> bstr = "{\"a\":1, \"b\":null}" :: LB.ByteString
> print $ bstr & key "b" . _Bool .~ True
"{\"a\":1,\"b\":null}"

没有任何变化。我在这里错过了什么?

问题是 _Bool 棱镜仅在键 "b" 的值是 TrueFalse 时才起作用,而不是当它是 Null 时.本质上,您试图将值的类型从 Null 更改为 Bool

您可能想改用 _Primitive 棱镜。类似于:

bstr & key "b" . _Primitive .~ BoolPrim True

请记住,这会将 任何 值更改为 True,而不仅仅是 Bools 或 Nulls。如果你想更有选择性,你可以这样做:

bstr & key "b" . _Primitive %~ (\b -> case b of
  NullPrim -> BoolPrim True
  _ -> b)