检查string是否是带有jq的有效JSON

Mil*_*iez 23 bash json jq

我需要在解除服务时发现错误.响应可以是null一个字符串错误消息

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

一切都很好,或有效的JSON.我想知道是否有办法jq简单地检查提供的字符串是否是有效的JSON.我可以检查字符串中的某些关键字,比如errorfe,但我正在寻找一个更强大的选项,例如.我得到一个true/false1/0从jq.我正在查看jq有关SO 的文档和一些问题但是所有内容都是关于从JSON中查找和选择键值,但没有关于简单地验证字符串的内容.

更新:

我有这个:

 result=$(some command)
Run Code Online (Sandbox Code Playgroud)

结果是字符串 error services-migration/foobar: Not found: services-migration/foobar

然后if语句:

 if jq -e . >/dev/null 2>&1 <<<"$result"; then
    echo "it catches it"
 else
    echo "it doesn't catch it"
 fi
Run Code Online (Sandbox Code Playgroud)

它总是在else条款中结束.

Tom*_*ech 22

从手册:

-e/--exit-status:

如果最后一个输出值既不是false也不是null,则将jq的退出状态设置为0;如果最后一个输出值为false或null,则将jq的退出状态设置为0;如果没有生成有效结果,则将4的退出状态设置为4.通常,如果存在任何使用问题或系统错误,jq将退出2;如果存在jq程序编译错误,则退出3;如果运行jq程序,则退出0.

所以你可以使用:

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
Run Code Online (Sandbox Code Playgroud)

事实上,如果你不关心区分不同类型的错误,那么你可能会失去-e开关.在这种情况下,任何被认为是有效JSON(包括false/null)的东西都将被过滤器成功解析.,程序将成功终止,因此if将遵循分支.


Red*_* SK 9

这对我有用

echo $json_string | ./jq -e . >/dev/null 2>&1  | echo ${PIPESTATUS[1]}
Run Code Online (Sandbox Code Playgroud)

返回返回码:

  • 0 - 成功
  • 1 - 失败
  • 4 - 无效

然后,您可以通过进一步的代码评估返回代码.

  • 我在这里不太确定。第一次运行可以给你一个空结果,然后重新运行相同的命令会给你一个 0。 (6认同)
  • 不是```| echo ${PIPESTATUS[1]}```,使用```;回声 ${PIPESTATUS[1]}``` (4认同)

Mig*_*fán 7

jq下面的命令和解释尝试以最便宜的方式使用,就像验证 JSON 的方法一样。在我看来,有更适合于此的工具(例如 JSONLint),但如果您手头唯一的东西就是jq那么这就是我的贡献。

STDERR要验证 JSON 文件并仍然在输出中获取错误,jq您可以使用以下 bash 单行代码

jq -reM '""' <<<'<MAYBE_INVALID_JSON>' 1>/dev/null
Run Code Online (Sandbox Code Playgroud)

内容如下:

  • jq带标志执行:

    • -r输出原始值(无处理或格式化)
    • -e0以大于出现错误时的代码退出
    • -M不要对 JSON 进行着色
  • 第一个jq参数'""'输出空字符串,有效防止jq对 JSON 进行任何打印处理

  • <<<后面跟着的字符串称为“Here String”,基本上是告诉 bash 将字符串视为文件并将其传递给STDIN(作为命令的输入)。

    请注意,您可以替换<<<'<MAYBE_INVALID_JSON>'为要验证的文件的路径,它仍然可以工作

  • 然后将任何STDOUT输出(通常包含 JSON)重定向到/dev/null,有效地丢弃它

您还可以使用以下命令变得更有趣并在错误下方输出自定义消息:

jq -reM '""' <<<'<MAYBE_INVALID_JSON>' 1>/dev/null || ( exit_code="$?"; echo 'ERROR: Invalid JSON file. See errors above' 1>&2; exit "$exit_code" )
Run Code Online (Sandbox Code Playgroud)

其中添加的部分内容如下:

  • ||意思是:如果上一个命令失败且退出代码非零,则运行以下命令
  • 使用 . 打开一个子 shell (。这实际上是需要的,因为我们想使用原始命令的退出代码退出
    • exit_code环境变量设置为最后一个命令的退出代码$?
    • 使用打印自定义错误消息echo
    • exit带有原始命令退出代码的子 shell$exit_code
  • 关闭子外壳