【问题标题】:Read Json array with JQ用 JQ 读取 Json 数组
【发布时间】:2019-07-31 19:06:17
【问题描述】:

在我的项目中,我生成了一个 json 文件,这里是一个示例(只有一个索引):

[
    {
        "aaa": "lklklk",
        "bbb": "uiop",
        "kkk": "zeez",
        "lll": 3,
        "_source": {
          "element1": "zzzz",
          "element2": "eeee",
          "element3": "hhhhh",
          "element4": "jjjjjj",
          "@timestamp": "2019-07-31T08:32:45.000Z",
          "element5": "1",
          "element6": "6768",
          "element7": "gggg",
          "element8": "ppppp"
        },
        {
        "aaa": "lklklk",
        "bbb": "uiop",
        "kkk": "zeez",
        "lll": 3,
        "_source": {
          "element1": "zzzz",
          "element2": "eeee",
          "element3": "hhhhh",
          "element4": "jjjjjj",
          "@timestamp": "2019-07-31T08:32:45.000Z",
          "element5": "1",
          "element6": "6768",
          "element7": "gggg",
          "element8": "ppppp"
        },
]

我用这个命令

var1=$(jq '.['$cpt'] | ._source .element1' file.json) 

我可以收到我的价值,但是我收到了这个错误:

jq 错误不能用数字索引数字

我已经尝试过了

var1=$(jq '.[] | ._source .element1' file.json) 

但我收到所有数据,我需要按索引接收数据。

这是我的 bash 代码:

while (($verification!=1))
  do
          elementa[$cpt]=$(jq '.['$cpt'] | ._source .element1' $File.json)
          elementb[$cpt]=$(jq '.['$cpt'] | ._source .element2' $File.json)
          elementc[$cpt]=$(jq '.['$cpt'] | ._source .element3' $File.json)
          elementd[$cpt]=$(jq '.['$cpt'] | ._source .element4' $File.json)
          elemente[$cpt]=$(jq '.['$cpt'] | ._source .element5' $File.json)
          elementf[$cpt]=$(jq '.['$cpt'] | ._source .element6' $File.json)
          elementg[$cpt]=$(jq '.['$cpt'] | ._source .element7' $File.json)
          elementh[$cpt]=$(jq '.['$cpt'] | ._source ."@timestamp"' $File.json)
          elementi[$cpt]=$(jq '.['$cpt'] | ._source .element8' $File.json)
done

对于每一行我都会收到相同的错误:/ 你知道我为什么会出现这个错误吗?

提前谢谢你。

【问题讨论】:

  • JSON文件中真的有数组吗?它需要像[ { ... }, { ... }, ...]
  • 用多个元素显示文件的外观。
  • 您好,是的,抱歉,这里是多个元素。我更新了帖子。
  • 示例输入仍然是无效的 JSON。您可以使用 jq 来诊断问题 [复数!],但请随意使用在线服务,例如 jsonlint.com :-)

标签: arrays json bash jq


【解决方案1】:

[编辑:此 A 已更新以反映 Q 的更新。]

  1. 给定的输入(仍然)不是有效的 JSON,但是在按照问题描述修复它之后,你可以使用这个 jq 过滤器来提取 .element1:

    .[0]._source.element1
    

    要提取第一个 ._source 中的所有项目,您可以简单地编写:

    .[0]._source[]
    

    或者,如果您想完全确定订单:

    .[0]._source[ "element1","element2","element3","element4","@timestamp","element5","element6","element7","element8"]
    

    无论哪种方式,一次提取所有项目(至少对于每个组)可能是可行的方法,即使确实有必要在 jq 之外单独处理每个项目。

  2. 行:

    var1=$(jq '.['$cpt'] | ._source .element1' file.json)
    

    是混乱的(就像所有其他类似的行一样)。显然你的意思是这样的:

    var1=$(jq ".[\"$cpt\"] | ._source .element1" file.json)
    

    $cpt 在其他地方显然是一个 bash 变量。但是,即使这是您的意图,最好以其他方式传入 bash 变量,例如如果 $cpt 是整数:

    var1=$(jq --argjson cpt "$cpt" '.[$cpt] | ._source .element1' file.json)
    

    当然,这仍然不能解决与示例 JSON 的不匹配问题。

  3. 有很多关于使用 jq 的单次运行中的值填充 bash 变量的 SO Q&A。参见例如 jq - return json as bash array

【讨论】:

  • 您好 De pointe,感谢您提供的详细信息 :) 我想在一个变量中包含一个元素。因为在那之后我需要验证不同的元素。那么如何将一个元素放在一个 var 中?我需要按数据和索引提取数据。
  • 我总是收到同样的错误:jq:错误(在 file.json:1):不能用数字索引编号 jq:错误(在 file.json:2):不能用数字索引数字
  • 如果 $cpt 是一个整数,最简单的方法是使用--argjson 而不是--arg
  • 嗨,Peak,是的,谢谢你。但是错误总是存在:/我不明白这个问题>
  • 你修复了 JSON 吗?尝试运行jq empty file.json
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多