Check if string is a valid JSON with jq

十年热恋 提交于 2020-06-24 07:07:19

问题


I need to catch an error when lifting a service. The response can be null, a string error message like

error services-migration/foobar: Not found: services-migration/foobar

or a valid JSON when everything is fine. I was wondering if there is a way with jq to simply check if the provided string is a valid JSON. I could ofc check the string for some keywords like error f.e., but I'm looking for a more robust option, where eg. I get a true/false or 1/0 from jq. I was looking through the docs of jq and also some questions here on SO but everything was about finding and picking out key-values from a JSON, but nothing about simply validating a string.

UPDATE:

I've got this:

 result=$(some command)

from which the result is the string error services-migration/foobar: Not found: services-migration/foobar

And then the if statement:

 if jq -e . >/dev/null 2>&1 <<<"$result"; then
    echo "it catches it"
 else
    echo "it doesn't catch it"
 fi

And it always ends up in the else clause.


回答1:


From the manual:

-e / --exit-status:

Sets the exit status of jq to 0 if the last output values was neither false nor null, 1 if the last output value was either false or null, or 4 if no valid result was ever produced. Normally jq exits with 2 if there was any usage problem or system error, 3 if there was a jq program compile error, or 0 if the jq program ran.

So you can use:

if jq -e . >/dev/null 2>&1 <<<"$json_string"; then
    echo "Parsed JSON successfully and got something other than false/null"
else
    echo "Failed to parse JSON, or got false/null"
fi

In fact, if you don't care about distinguishing between the different types of error, then you can just lose the -e switch. In this case, anything considered to be valid JSON (including false/null) will be parsed successfully by the filter . and the program will terminate successfully, so the if branch will be followed.




回答2:


This is working for me

echo $json_string | jq -e . >/dev/null 2>&1  | echo ${PIPESTATUS[1]}

that returns return code:

  • 0 - Success
  • 1 - Failed
  • 4 - Invalid

Then you can evaluate the return code by further code.



来源:https://stackoverflow.com/questions/46954692/check-if-string-is-a-valid-json-with-jq

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!