使用lens-aeson提取JSON字段时组合棱镜

Hap*_*pal 1 json haskell lenses aeson haskell-lens

我有一个类似于以下内容的JSON Blob:

[
  {
    "version": 1
  },
  {
    "version": "3"
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

请注意,有些版本是数字,有些是字符串。我想获取版本列表。我可以使用以下镜头组合来提取数字版本:

v1 :: [String]
v1 = obj ^.. AL.values . AL.key fieldName . AL._Number . to show
Run Code Online (Sandbox Code Playgroud)

然后下面提取字符串

v2 :: [String]
v2 = obj ^.. AL.values . AL.key fieldName . AL._String . to T.unpack
Run Code Online (Sandbox Code Playgroud)

但是,如何通过一次遍历列表来获得版本列表?是否有任何镜头组合器需要镜头AL._Number . to showAL._String . to T.unpack返回组合的吸气剂,以便如果第一个失败,则尝试第二个?msum镜片像什么?

Car*_*arl 5

实际上,有一个组合器会尝试一个光学器件,如果第一个失效,则会进行备份。称为失败

请注意,您描述的情况应满足其条件。即使不是,组合器仍会起作用,在重构时它只会表现出不规则的行为。(这是使用filter作为a 的主要问题Traversal。)