使用jq创建JSON文件

时间:2017-08-02 19:10:09

标签: json jq

我尝试通过执行以下命令来创建JSON文件:

jq --arg greeting world '{"hello":"$greeting"}' > file.json

此命令在没有任何输入的情况下卡住。而

jq -n --arg greeting world '{"hello":"$greeting"}' > file.json无法正确解析。我只是想知道是否真的可以创建一个JSON文件。

3 个答案:

答案 0 :(得分:2)

因此,您的代码无法正常工作,因为将变量包含在双引号内,并将其视为字符串。这就是它无法正常工作的原因

作为@Jeff Mercado,指出解决方案是

jq -n --arg greeting world '{"hello":$greeting}' > file.json

关于名称中的-。这实际上是可能的。但截至目前,这在jq的发布版本中不可用。如果在系统上编译jq的主分支。有一个名为$ARGS.named的新变量可用于访问信息。

我刚编译并检查下面的命令,它就像魅力一样

./jq -n --arg name-is tarun '{"name": $ARGS.named["name-is"]}'
{
  "name": "tarun"
}

答案 1 :(得分:1)

要添加JeffTarun已经说过的内容,您可能需要在命令中使用\()字符串插值语法。例如

jq -n --arg greeting world '{"hello":"\($greeting)"}'

对我来说这会产生

{
  "hello": "world"
}

关于你对Jeff评论的回复,你选择的参数名必须是一个有效的jq变量名,所以像greeting-for-you这样的arg不起作用,你可以使用下划线,所以greeting_for_you就可以了。或者您可以使用Tarun描述的版本。

答案 2 :(得分:1)

$ARGS可从jq命令行访问命名(--arg name value)和位置(--args one two three)自变量,并允许您轻松安全地构建对象。

命名参数:

$ jq -n '{christmas: $ARGS.named}' \
  --arg one 'partridge in a "pear" tree' \
  --arg two 'turtle doves'

{
  "christmas": {
    "one": "partridge in a \"pear\" tree",
    "two": "turtle doves"
  }
}

位置参数:

$ jq -n '{numbers: $ARGS.positional}' --args 1 2 3

{
  "numbers": [
    "1",
    "2",
    "3"
  ]
}

请注意,您可以访问位置数组的各个项目,并且命名参数可以直接用作变量:

jq -n '{first: {name: $one, count: $ARGS.positional[0]}, all: $ARGS}' \
  --arg one 'partridge in a "pear" tree' \
  --arg two 'turtle doves' \
  --args 1 2 3

{
  "first": {
    "name": "partridge in a \"pear\" tree",
    "count": "1"
  },
  "all": {
    "positional": [
      "1",
      "2",
      "3"
    ],
    "named": {
      "one": "partridge in a \"pear\" tree",
      "two": "turtle doves"
    }
  }
}