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"
的值是 True
或 False
时才起作用,而不是当它是 Null
时.本质上,您试图将值的类型从 Null
更改为 Bool
。
您可能想改用 _Primitive
棱镜。类似于:
bstr & key "b" . _Primitive .~ BoolPrim True
请记住,这会将 任何 值更改为 True
,而不仅仅是 Bool
s 或 Null
s。如果你想更有选择性,你可以这样做:
bstr & key "b" . _Primitive %~ (\b -> case b of
NullPrim -> BoolPrim True
_ -> b)
我是 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"
的值是 True
或 False
时才起作用,而不是当它是 Null
时.本质上,您试图将值的类型从 Null
更改为 Bool
。
您可能想改用 _Primitive
棱镜。类似于:
bstr & key "b" . _Primitive .~ BoolPrim True
请记住,这会将 任何 值更改为 True
,而不仅仅是 Bool
s 或 Null
s。如果你想更有选择性,你可以这样做:
bstr & key "b" . _Primitive %~ (\b -> case b of
NullPrim -> BoolPrim True
_ -> b)