This is how I am trying to ouput the message of an array element using jq
echo '{ errors: [{ "code": "INVALID", "message": "message" }] }' | jq -r '.errors[0].message'
But errors is an optional value. If there is no error, the field is missing. How do I have to handle the optional value correctly in jq?
So in the example the result is message and if there is no error, the result is empty.
>Solution :
You can use an if … then … else … end expression (see the manual) checking the existence of a field using has (see the manual):
… | jq -r 'if has("errors") then .errors[0].message else "no errors" end'
Alternatively, use the alternative operator // which is triggered on null or false (see the manual):
… | jq -r '.errors[0].message // "no errors"'
If your code would run into an exception, you can also equip the test with the error suppression operator ? (see the manual), which is not necessary with your sample code as it evaluates to null without errors if the .errors field was missing (see the manual: "it produces the value at the key, or null if there’s none present."):
… | jq -r '(.errors[0].message)? // "no errors"'
As @SUTerliakov pointed out, you can use empty anywhere in these examples instead of (the dummy string) "no errors" if you want no result at all on success.