首页 > 解决方案 > JMESPath 加入输出并去除不需要的字符

问题描述

我有以下json;

[
  {
    "compartment-id": "CompartmentID-123",
    "defined-tags": {},
    "display-name": "Test-123",
    "freeform-tags": {},
    "id": "ID-ABC",
    "kms-key-id": "",
    "lifecycle-state": "ACTIVE",
  }
]

我希望将idanddisplay-name参数加入一个逗号分隔的字符串中,"[]剥离,如下所示:

ID-ABC,Test-123

到目前为止,我设法得到的最接近的是:

oci fs file-system list -c $compart --availability-domain $ad --query 'data[].[id,"display-name"][]' | tr -d '" '
[
ID-ABC,
Test-123
]

想知道在 JMESPath 中是否有一种更简洁的方式来完成这一切,而无需通过管道输出到tr、或等jqsedawk

更新基于来自 β.εηοιτ.βε 的输入

很近...

oci fs file-system list -c $compart --availability-domain $ad3 --query 'data[0].join(',', [id, "display-name"])'

退货

ParseError: invalid token: Parse error at column 13, token "," (COMMA), for expression:
"data[0].join(,, [id, "display-name"])"

但是玩引号,我能得到的最好的方法是使用;

oci fs file-system list -c $compart --availability-domain $ad3 --query "data[0].join(',', [id, 'display-name'])"
Private key passphrase:
"ID-ABC,display-name"

我开始怀疑我的本地设置或外壳是否有问题,从而被引号弄糊涂了?

标签: jsonjmespath

解决方案


由于您确实有一个数组,因此您首先需要定位数组的第一个元素,以摆脱它。由于数组是基于 0 的,因此可以通过以下方式轻松实现:

data[0]

这使

{
  "compartment-id": "CompartmentID-123",
  "defined-tags": {},
  "display-name": "Test-123",
  "freeform-tags": {},
  "id": "ID-ABC",
  "kms-key-id": "",
  "lifecycle-state": "ACTIVE"
}

然后,为了创建您要查找的字符串,您可以使用该join函数,该函数接受作为参数的粘合字符和数组。

您可以使用过滤器和多选列表轻松获得所需的数组:

data[0].[id, "display-name"]

这使

[
  "ID-ABC",
  "Test-123"
]

现在我们只需要join在所有这些之上应用该功能:

data[0].join(',', [id, "display-name"])

最后给出:

"ID-ABC,Test-123"

在 JMESPath 中引用的附加说明:

所以:

data[0].join(',', [id, "display-name"])

data[0].join(`,`, [id, "display-name"])

是两个严格相等的查询。

尽管

data[0].join(',', [id, 'display-name'])

具有完全不同的含义,并且会以字符串display-name作为数组的第二个元素结束,因此它将导致

"ID-ABC,display-name"

所有这些都基于 JSON 结构:

{
   "data":[
      {
         "compartment-id":"CompartmentID-123",
         "defined-tags":{},
         "display-name":"Test-123",
         "freeform-tags":{},
         "id":"ID-ABC",
         "kms-key-id":"",
         "lifecycle-state":"ACTIVE"
      }
   ]
}

推荐阅读