我正在尝试生成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中,然后再进行第二步转换,会更容易或更清楚吗?
答案 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