当前位置:  开发笔记 > 前端 > 正文

使用镜头为嵌套Map添加键和值

如何解决《使用镜头为嵌套Map添加键和值》经验,为你挑选了1个好方法。

我正在努力找出用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}}"

当然,这是我做错了什么,但我认为我没有法术力来理解究竟是什么.

请你指点我正确的方向吗?

谢谢!



1> András Kovác..:

正如dfeuer所指出的,at可以插入到地图,而keyix如果存在的话仅仅遍历元件.我们可以做到以下几点:

> "{ \"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"

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有