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

时间:2019-02-21 18:37:27

标签: json jq

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

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

产生此输出:

{
  "happystring": "Bob Ross",
  "unhappynumber1": "1942",
  "unhappyboolean": "true"
}

我知道我可以使用tonumber在简单的过滤器中将字符串转换为数字。但是,我不知道如何将字符串转换为布尔值。而且,在从Shell vars进行采购并创建新的json作为输出时,我无法确定该怎么做。

所需的输出:

{
  "happystring": "Bob Ross",
  "unhappynumber1": 1942,
  "unhappyboolean": true
}

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

2 个答案:

答案 0 :(得分:3)

无需像--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"

如果您不希望字符串实参使用--arg引号,例如也可以将--argjson混合在字符串上,将"混合在字符串上,note in the manual程序文本确实适用于任何需要在shell中转义的带有参数的参数:

  

注意:请务必注意外壳的报价规则。通常,最好总是对jq程序加引号(用单引号引起来),因为太多对jq具有特殊含义的字符也是shell元字符。例如,jq“ foo”将在大多数Unix shell上失败,因为它与jq foo相同,后者通常会因为未定义foo而失败。使用Windows命令外壳程序(cmd.exe)时,最好在命令行上给jq程序加上双引号(而不是-f program-file选项),但是jq程序中需要双引号反斜杠转义。

答案 1 :(得分:1)

您可以使用String str = ""; String[] newString = new String[str.length()]; 过滤器进行检查并返回true / false。而且我认为您可以直接使用过滤器,而无需创建json并再次进行转换。

test

将输出为:

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