Am trying to do a simple if/then/else using JMESPath
For example: 'if the input is a string, return the string, else return the "value" property of the input'. An input of "abc"
would return "abc"
. An input of {"value":"def"}
would return "def"
With jq
this is easy: if .|type == "string" then . else .value end
With JMESPath, I can get the type
type(@)
or the input:
@
or the value
property:
value
but I have not found a way to combine them into an if-then-else. Is there any way to do this?
people[?general.id !=100
] || people
{
"people": [
{
"general": {
"id": 100,
"age": 20,
"other": "foo",
"name": "Bob"
},
"history": {
"first_login": "2014-01-01",
"last_login": "2014-01-02"
}
},
{
"general": {
"id": 101,
"age": 30,
"other": "bar",
"name": "Bill"
},
"history": {
"first_login": "2014-05-01",
"last_login": "2014-05-02"
}
}
]
}
if else condition works here
It is possible but not cleanly. The general form is to:
This should allow you to also derive possible transformations for both the false and true conditions
For example, if the test data is as so:
{
"test": 11
}
Depending on the value you can get either produce the results (using test data 11 and 2 as example):
Like so:
[
map(
&join(' ', ['Yes, the value is', to_string(@), 'which is greater than 10']),
[test][? @ > `10`]
),
join(' ', ['No the value is', to_string(test), ' which is less than or equal to 10'])
][] | @[0]
So to abstract a template:
[
map(
&<True Expression Here>,
[<Expression you are testing>][? @ <Test Expression>]
),
<False Expression Here>)
][] | @[0]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With