我正在努力找出用Aeson镜头操纵JSON的问题.我的任务就像在JSON中向嵌套对象添加密钥一样简单.我能够通过以下方式更改现有密钥:
> :set -XOverloadedStrings > import Control.Lens > import Data.Aeson > import Data.Aeson.Lens > "{ \"a\": { \"b\": 10 } }" & key "a" . key "b" .~ String "jee" "{\"a\":{\"b\":\"jee\"}}"
但是当我尝试使它处理新密钥时,它只是默默地无法添加它:
> "{ \"a\": { \"b\": 10 } }" & key "a" . key "c" .~ String "jee" "{\"a\":{\"b\":10}}"
当然,这是我做错了什么,但我认为我没有法术力来理解究竟是什么.
请你指点我正确的方向吗?
谢谢!
正如dfeuer所指出的,at
可以插入到地图,而key
与ix
如果存在的话仅仅遍历元件.我们可以做到以下几点:
> "{ \"a\": { \"b\": 10 } }" & key "a" . _Object . at "c" ?~ String "foo" "{\"a\":{\"b\":10,\"c\":\"foo\"}}
at
是一个聚焦于Maybe element
-s 的镜头,我们可以通过设置到Just
某个元素插入,并通过设置删除Nothing
.at "c" ?~ String "foo"
是一样的at "c" .~ Just (String "foo")
.
如果我们想要嵌套插入,我们可以non
用来定义要插入的默认值:
> "{ \"a\": { \"b\": 10 } }" & key "a" . _Object . at "c" . non (Object mempty) . _Object . at "d" ?~ String "foo" "{\"a\":{\"b\":10,\"c\":{\"d\":\"foo\"}}}"
这是一个满口的,所以我们可以考虑一些部分:
> let atKey k = _Object . at k > "{ \"a\": { \"b\": 10 } }" & key "a" . atKey "c" . non (Object mempty) . atKey "d" ?~ String "foo"