当你有多个数据结构,但没有与jq中的json连接时,它叫什么?

时间:2017-05-31 18:48:38

标签: jq

例如,我的jq命令可能会出现这样的内容:

"some string"
"some thing"
"some ping"
...

请注意,项目之间没有外部对象或数组,也没有逗号。

或者你可能有类似的东西:

["some string"
"some thing"
"some ping"]
["some wing"
"some bling"
"some fing"]

但同样,没有逗号或外部对象或数组,并且它们之间没有逗号来表示这是JSON。

我一直在想答案是它被称为“原始”,但我对此不确定。

我特意在文档中寻找一个可以处理上述各种示例的术语,但我不知道如何继续。

1 个答案:

答案 0 :(得分:1)

首先,jq manual.yml以这种方式描述了过滤器的行为:

  

有些过滤器产生多个结果,例如有一个过滤器     生成其输入数组的所有元素。管道那个过滤器     进入第二个运行第二个过滤器的每个元素     阵列。通常,可以通过循环和迭代完成的事情     在其他语言中只需将过滤器粘合在一起即可完成。

     

重要的是要记住每个过滤器都有一个输入和一个     输出。甚至像“你好”或42这样的文字都是过滤器 - 它们需要一个     输入但总是产生与输出相同的文字。操作     结合两个过滤器,如添加,通常输入相同的输入     两者并结合结果。因此,您可以实现平均     过滤为add / length - 将输入数组提供给add     过滤和length过滤器然后执行除法。

同样重要的是要记住,jq的默认行为是为每个JSON对象运行一次指定的过滤器。在下面的示例中,jq每次运行一次标识过滤器四次:

$ (echo 2;echo {}; echo []; echo 3) | jq .
2
{}
[]
3

这里发生的事情类似于

$ jq -n '2, {}, [], 3 | .'
2
{}
[]
3

由于这并不总是您想要的,-s选项可用于告诉jq将单独的值收集到数组中并将其提供给过滤器:

$ (echo 2;echo {}; echo []; echo 3)| jq -s .
[
  2,
  {},
  [],
  3
]

类似于

$ jq -n '[2, {}, [], 3] | .'
[
  2,
  {},
  [],
  3
]

jq manual.yml解释了如何包含--raw-input / -R选项,以便更好地控制输入处理:

  

不要将输入解析为JSON。相反,每行文本都作为字符串传递给过滤器。如果与--slurp结合使用,则整个输入将作为单个长字符串传递给过滤器。

您可以看到在此示例中使用-s-R选项会产生不同的结果:

$ (echo 2;echo {}; echo []; echo 3)| jq -s -R .
"2\n{}\n[]\n3\n"