从 jq 构建 json

从 jq 构建 json

我想在 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 格式。 etsvalue 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[@]}" )" )"

-pmake 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"
  ]
}

相关内容