我想在 jq 中生成一个 json 文件,如下所示:
{
"cpe": "dabb8fbd-d7be-4175-abb4-c628bb8cf1b5",
"ps": [ "Obev" ],
"ets": 5,
"pMap": {
"aik": ["1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"]
}
这是我在 jq 中尝试的 -
inner2=$(jq -n --arg aik "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" \
'$ARGS.named')
res=$(jq -n --arg cpe "App" \
--arg ps "["Obev"]" \
--arg ets 5 \
--argjson pMap "$inner2" \
'$ARGS.named')
但它没有按预期返回 JSON 格式。
ets
value if5
这是 int 因此不需要引号,但它会生成一个
pMap
值,如下所示"aik": {"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"}
这里根据需要的操作,未生成格式
ps
值也没有根据所需的操作生成
任何帮助都会很棒
答案1
使用jo
(参见这里),这使得在命令行上创建 JSON 比在命令行上创建 JSON 更容易jq
。它允许使用创建数组jo -a
。
jo -p \
cpe='dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \
ps="$( jo -a Obev )" \
ets=5 \
pmap="$( jo aik="$( jo -a \
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1" \
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2" \
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3" \
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4" \
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" )" )"
假设您使用的 shell 有数组,这ets
就是数组的长度aik
:
data=(
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"
)
jo -p \
cpe='dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \
ps="$( jo -a Obev )" \
ets="${#data[@]}" \
pmap="$( jo aik="$( jo -a "${data[@]}" )" )"
-p
make sat的选项可以漂亮jo
地打印输出,因此当您对文档的结构正确感到满意时将其删除。
jq
假设数组存在,相应的命令data
是
jq -n \
--arg cpe 'dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \
--argjson ps "$( jq -n '$ARGS.positional' --args Obev )" \
--arg ets "${#data[@]}" \
--argjson pmap "$(
jq -n --argjson aik "$( jq -n '$ARGS.positional' --args "${data[@]}" )" \
'$ARGS.named'
)" \
'$ARGS.named'
也就是说,使用
jq -n '$ARGS.positional' --args some arguments here
创建一个匿名数组。
答案2
你需要花更多的时间阅读jq手册:https://stedolan.github.io/jq/manual/
values=(
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4"
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"
)
inner=$(jq -n --args '{aik: $ARGS.positional}' "${values[@]}")
echo "$inner"
{
"aik": [
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1",
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2",
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3",
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4",
"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"
]
}