【问题标题】:jq — Extract strings contained in nested arrays and objectsjq — 提取嵌套数组和对象中包含的字符串
【发布时间】:2021-11-30 10:53:07
【问题描述】:

我有这个 jq 过滤器和输入:

( ._birthDate.extension[0] | .url, ( .extension[0] | .url, .valueString ), ( .extension[1] | .url, .valueString ) )
{
   "_birthDate":{
      "extension":[
         {
            "url":"http://catsalut.gencat.cat/fhir/StructureDefinition/patient-dataBirhtDeath",
            "extension":[
               {
                  "url":"country",
                  "valueString":"724"
               },
               {
                  "url":"state",
                  "valueString":"08"
               }
            ]
         }
      ]
   }
}

...产生以下输出:

"http://catsalut.gencat.cat/fhir/StructureDefinition/patient-dataBirhtDeath"
"country"
"724"
"state"
"08"

我想重构过滤器:

( ._birthDate.extension[0] | .url, ( .extension[:2] | .url, .valueString ) )

…但我收到以下错误:

jq: error (at :18): Cannot index array with string "url"

看到这个demo

【问题讨论】:

  • 请在此处粘贴 JSON,而不是链接到外部站点。另外,您是否希望获得与第一种情况相同的输出?
  • 表达式.extension[:2] 生成一个数组,而您期望数组元素。因此,只需迭代元素即可:.extension[:2][]
  • @choroba。我在帖子中添加了 json。是的,我期待相同的输出。

标签: jq


【解决方案1】:

数组/字符串切片:.[10:15] [docs]

...任何一个索引都可以是负数(在这种情况下,它从数组的末尾倒数)、或省略(在这种情况下它指的是数组的开头或结尾) .

所以你第一次使用.extension[0] 那个ment:从.extension where 获取索引0

.extension[:2] 表示:从.extension 获取索引0 并包括索引2


正如@pmf 已经提到的,不同之处在于返回值,一开始是一个对象,二是一个数组。

因此,您可以使用 [] 循环遍历数组,为 .extension 数组中的每个对象返回 .url.valueString

._birthDate.extension[0] | .url, ( .extension[:2][] | .url, .valueString )

Online Demo


但是,由于 .extension 是一个只有 2 个索引的数组,:2 部分在您的示例中没有任何用处,所以为什么不将其简化为:

._birthDate.extension[0] | .url, ( .extension[] | .url, .valueString )

Online Demo

【讨论】:

    【解决方案2】:

    如果您只需要保留字符串,那么您可以使用.. 递归遍历您的文档并使用strings 过滤掉沿途产生的非字符串:

    .. | strings
    

    Demo

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2019-06-06
      • 2023-03-12
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      相关资源
      最近更新 更多