英文:
cannot parse json with jq to store value in two vars
问题
var1 = "59.42028985507246" 和 var2 = "18.823529411764707"
英文:
Team,
half way done but cannot figure out what am I missing. new to jq. searched google too.
json from curl response is below
curl -u ${TOKEN}: $url | jq -r '.projectStatus'
{
"status": "ERROR",
"conditions": [
{
"status": "OK",
"metricKey": "new_reliability_rating",
"comparator": "GT",
"periodIndex": 1,
"errorThreshold": "1",
"actualValue": "1"
},
{
"status": "OK",
"metricKey": "new_security_rating",
"comparator": "GT",
"periodIndex": 1,
"errorThreshold": "1",
"actualValue": "1"
},
{
"status": "OK",
"metricKey": "new_maintainability_rating",
"comparator": "GT",
"periodIndex": 1,
"errorThreshold": "1",
"actualValue": "1"
},
{
"status": "ERROR",
"metricKey": "new_coverage",
"comparator": "LT",
"periodIndex": 1,
"errorThreshold": "80",
"actualValue": "59.42028985507246"
},
{
"status": "ERROR",
"metricKey": "new_duplicated_lines_density",
"comparator": "GT",
"periodIndex": 1,
"errorThreshold": "3",
"actualValue": "18.823529411764707"
}
],
"periods": [],
"ignoredConditions": false
}
new_reliability_rating
new_security_rating
new_maintainability_rating
new_coverage
new_duplicated_lines_density
but I want to pull actualValue
from these two sets and store them in var1 and var2
new_coverage
new_duplicated_lines_density
so I tried as first step below.
curl -u ${TOKEN}: $url | jq -r '.projectStatus'.conditions[] | map(select(.metricKey == "new_coverage"))
error
./curl.sh: syntax error near unexpected token `select'
I want to store the response in two vars.
var1 = "59.42028985507246" and var2 = "18.823529411764707"
答案1
得分: 2
你的单引号使用错误,它们应该包围整个参数。你的 jq 程序还存在一些其他小问题,比如在流式处理/迭代数组时不需要使用 `map`。
然而,以下的 jq 命令应该可以工作:
```shell
json="$(curl ...)"
var1="$(printf '%s' "$json" | jq -r '.projectStatus.conditions[]|select(.metricKey=="new_coverage").actualValue')"
var2="$(printf '%s' "$json" | jq -r '.projectStatus.conditions[]|select(.metricKey=="new_duplicated_lines_density").actualValue')"
或者,可以在变量中只存储公共部分,而不是完整的 JSON:
conditions="$(curl ... | jq '.projectStatus.conditions[]')"
var1="$(printf '%s' "$conditions" | jq -r 'select(.metricKey=="new_coverage").actualValue')"
var2="$(printf '%s' "$conditions" | jq -r 'select(.metricKey=="new_duplicated_lines_density").actualValue')"
在你的 jq 程序中,可以使用括号和 替代运算符 //
来提供一个备用值:
(.projectStatus.conditions[]|select(.metricKey=="new_coverageX").actualValue)//null
英文:
You have your single quotes wrong, they should enclose the full argument. Ther are some other minor issues with your jq program, e.g. map
is not needed, when you stream/iterate the array.
Nevertheless, the following jq command should work:
json="$(curl ...)"
var1="$(printf '%s' "$json" | jq -r '.projectStatus.conditions[]|select(.metricKey=="new_coverage").actualValue')"
var2="$(printf '%s' "$json" | jq -r '.projectStatus.conditions[]|select(.metricKey=="new_duplicated_lines_density").actualValue')"
Alternatively, instead of storing the full json in a variable, you could store only the common part in the variable:
conditions="$(curl ... | jq '.projectStatus.conditions[]')"
var1="$(printf '%s' "$conditions" | jq -r 'select(.metricKey=="new_coverage").actualValue')"
var2="$(printf '%s' "$conditions" | jq -r 'select(.metricKey=="new_duplicated_lines_density").actualValue')"
To provide a fallback value, use parentheses and the alternative operator //
in your jq program:
(.projectStatus.conditions[]|select(.metricKey=="new_coverageX").actualValue)//null
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论