Sky*_*ter 12 haskell lenses aeson haskell-lens
我正在努力找出用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\"}}"
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使它处理新密钥时,它只是默默地无法添加它:
> "{ \"a\": { \"b\": 10 } }" & key "a" . key "c" .~ String "jee"
"{\"a\":{\"b\":10}}"
Run Code Online (Sandbox Code Playgroud)
当然,这是我做错了什么,但我认为我没有法术力来理解究竟是什么.
请你指点我正确的方向吗?
谢谢!
And*_*ács 17
正如dfeuer所指出的,at可以插入到地图,而key与ix如果存在的话仅仅遍历元件.我们可以做到以下几点:
> "{ \"a\": { \"b\": 10 } }" & key "a" . _Object . at "c" ?~ String "foo"
"{\"a\":{\"b\":10,\"c\":\"foo\"}}
Run Code Online (Sandbox Code Playgroud)
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\"}}}"
Run Code Online (Sandbox Code Playgroud)
这是一个满口的,所以我们可以考虑一些部分:
> let atKey k = _Object . at k
> "{ \"a\": { \"b\": 10 } }" & key "a" . atKey "c" . non (Object mempty) . atKey "d" ?~ String "foo"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1165 次 |
| 最近记录: |