JQ转换为数字,从shell变量生成新的json时转换为boolean

Bal*_*lok 4 json jq

我正在尝试生成 json 输出,其中输入来自 shell 变量。

happystring="Bob Ross"
unhappynumber1="1942"
unhappyboolean=true

JSON=$(jq -n \
        --arg happystring "$happystring" --arg unhappynumber1 "$unhappynumber1" \
        --arg unhappyboolean $unhappyboolean \
        '
        {
            happystring: $happystring,
            unhappynumber1: $unhappynumber1,
            unhappyboolean: $unhappyboolean
        }
        ')

echo "$JSON" | jq
Run Code Online (Sandbox Code Playgroud)

产生这个输出:

{
  "happystring": "Bob Ross",
  "unhappynumber1": "1942",
  "unhappyboolean": "true"
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以用tonumber一个简单的过滤器将字符串转换为数字。但是,我无法弄清楚如何将字符串转换为布尔值。而且我在从 shell vars 采购和创建新的 json 作为输出时无法推理如何做。

期望的输出:

{
  "happystring": "Bob Ross",
  "unhappynumber1": 1942,
  "unhappyboolean": true
}
Run Code Online (Sandbox Code Playgroud)

如果我在一个步骤中生成 json 并将其存储在 shell var 中,然后在第二个步骤中执行额外的转换,会更容易或更清楚吗?

Kam*_*mal 9

您可以使用test过滤器进行检查并返回 true/false。我认为你可以直接使用过滤器,不需要创建 json 并再次转换。

happystring="Bob Ross"
unhappynumber1="1942"
unhappyboolean=true

JSON=$(jq -n \
        --arg happystring "$happystring" --arg unhappynumber1 "$unhappynumber1" \
        --arg unhappyboolean $unhappyboolean \
        '
        {
            happystring: $happystring,
            unhappynumber1: $unhappynumber1 | tonumber,
            unhappyboolean: $unhappyboolean | test("true")
        }
        ')

echo "$JSON" | jq
Run Code Online (Sandbox Code Playgroud)

输出如下:

{
  "happystring": "Bob Ross",
  "unhappynumber1": 1942,
  "unhappyboolean": true
}
Run Code Online (Sandbox Code Playgroud)


los*_*der 7

不需要将变量转换为字符串,就像--arg只将它们转换回来一样,您可以使用--argjson并仍然单独输入它们,但类型由正常的 JSON 规则确定:

happystring='"Bob Ross"'
unhappynumber1=1942
unhappyboolean=true

JSON=$(jq -n \
      --argjson happystring "$happystring" \
      --argjson unhappynumber1 "$unhappynumber1" \
      --argjson unhappyboolean "$unhappyboolean" \
      '
      {
          happystring: $happystring,
          unhappynumber1: $unhappynumber1,
          unhappyboolean: $unhappyboolean
      }
      ')

      echo "$JSON"
Run Code Online (Sandbox Code Playgroud)

如果您不希望字符串参数需要文字引号,您也可以混合--arg使用字符串和--argjson其他所有内容",因为手册中关于 shell 引用和程序文本的注释确实适用于任何需要在 shell 中转义的字符的参数:

注意:注意 shell 的引用规则很重要。作为一般规则,最好总是引用(使用单引号字符)jq 程序,因为太多对 jq 具有特殊含义的字符也是 shell 元字符。例如,jq "foo" 将在大多数 Unix shell 上失败,因为它与 jq foo 相同,后者通常会失败,因为 foo 未定义。使用 Windows 命令外壳 (cmd.exe) 时,最好在命令行上给出 jq 程序时使用双引号(而不是 -f 程序文件选项),但随后 jq 程序中的双引号需要反斜杠转义。