解析 JSON jq 只返回键而不返回值

问题描述

假设我有这个:

https://api.apis.guru/v2/specs/adyen.com/CheckoutService/64/openapi.json

我想抢:

/orders
/orders/cancel
/originKeys
/paymentLinks
/paymentLinks/{linkId}
/paymentMethods
/paymentMethods/balance
/paymentSession
/payments
/payments/details
/payments/result

我想以一种优雅的方式做到这一点,只是抓住路径,我正在做的是这个丑陋的解决方法,它不适用于某些 api:

curl -A "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:86.0) Gecko/20100101 Firefox/86.0" -ks "https://api.apis.guru/v2/specs/adyen.com/CheckoutService/64/openapi.json"  | jq -r '.paths' | grep "/" | grep "{" | egrep -iv "microsoft|amz|application/json|application/jwt|\*|text/xml|text/plain|application/|multipart/form-data|text/html" | cut -d "\"" -f 2

解决方法

使用 jq

$ jq -r '.paths | keys | .[]' openapi.json
/orders
/orders/cancel
/originKeys
/paymentLinks
/paymentLinks/{linkId}
/paymentMethods
/paymentMethods/balance
/paymentSession
/payments
/payments/details
/payments/result

在您的情况下,您当然希望将 curl 输出通过管道传输到 jq,而不是使用文件。

与您使用 jq 相比的导入位是将 .paths 数组输送到 keys 并将其输送到 .[] 以获得每行一个元素而不是 JSON 数组,和 -r 以避免将每一行打印为带引号的 JSON 字符串。