【问题标题】:jq get each value in array with parentjq用父级获取数组中的每个值
【发布时间】:2017-08-31 13:41:12
【问题描述】:

我有如下所示的 json。我想得到一个输出,其中包含每个计时器记录的一行,但包含服务的名称。

{  
   "services":{  
      "service":[  
         {  
            "name":"Test Value",
            "timer":[  
               { "datetime":"08/30/2017 16:33:35", "value":"625" },
               { "datetime":"08/30/2017 16:22:38", "value":"240" }
            ]
         },
         {
            "name":"Test Value 2",
            "timer":[
               { "datetime":"08/30/2017 16:07:38", "value":"432" },
               { "datetime":"08/30/2017 15:59:07", "value":"1355" }
            ]
         }
      ]
   }
}

我想出了.services.service[].name as $name | .services.service[].timer | map([ $name, .datetime, .value ]),这让我很感动

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]]
[["Test Value","08/30/2017 16:07:38","432"],["Test Value","08/30/2017 15:59:07","1355"]]
[["Test Value 2","08/30/2017 16:33:35","625"],["Test Value 2","08/30/2017 16:22:38","240"]]
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]]

我期望的输出是

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]]
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]]

但请注意,服务和计时器集的值是重复的。我错过了什么?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    .services.service[]|[{name,timer:.timer[]}|[.name,.timer[]]] 会给你预期的输出,

    .services.service[]|{name,timer:.timer[]}|[.name,.timer[]](没有数组聚合)将为每个计时器提供一个结果:

    ["Test Value","08/30/2017 16:33:35","625"]
    ["Test Value","08/30/2017 16:22:38","240"]
    ["Test Value 2","08/30/2017 16:07:38","432"]
    ["Test Value 2","08/30/2017 15:59:07","1355"]
    

    你在尝试中错过的是

    表达式 exp 为 $x | ... 表示:对于表达式 exp 的每个值,使用整个原始输入运行管道的其余部分,并将 $x 设置为该值。因此 as 函数类似于 foreach 循环。

    如果你真的想使用变量,你需要这样做:.services.service[]| .name as $name | .timer | map([ $name, .datetime, .value ])

    【讨论】:

      【解决方案2】:

      这是另一个演示数组构造函数变体的解决方案。请注意 [ ] 在每个中的位置略有不同。使用您的数据,此过滤器

       .services.service[] | {name} + .timer[]
      

      生成单个对象流

      {"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"}
      {"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"}
      {"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"}
      {"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"}
      

      这个过滤器

       .services.service[] | [ {name} + .timer[] ]
      

      为每个服务生成对象数组

      [{"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"},{"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"}]
      [{"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"},{"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"}]
      

      这个过滤器

       .services.service[] | {name} + .timer[] | [.[]]
      

      生成数组流

      ["Test Value","08/30/2017 16:33:35","625"]
      ["Test Value","08/30/2017 16:22:38","240"]
      ["Test Value 2","08/30/2017 16:07:38","432"]
      ["Test Value 2","08/30/2017 15:59:07","1355"]
      

      还有这个过滤器

       .services.service[] | [ {name} + .timer[] | [.[]] ]
      

      为每个服务生成数组数组

      [["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]]
      [["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]]
      

      【讨论】:

        【解决方案3】:

        我认为根据数据所在的级别以及您希望它在结果中的位置来尝试将其可视化会很有帮助。在扁平化数据层次结构时,我发现更容易将其视为在一个级别中获取值,然后将其与下一个级别的值组合。

        因此,查看各个服务对象,您想要获取名称,并将其与其计时器对象的属性结合起来,并为每个组合生成一个结果。所以从这里开始:

        [.name] + (properties of the timer objects)
        

        然后你需要生成properties of the timer objects

        .timer[] | [.datetime, .value]
        

        您可以将其解读为:“对于timer 数组中的每个项目,创建一个包含datetimevalue 属性的数组。”

        一旦您将所有内容都放在同一级别,您可以根据需要重新排列值,但幸运的是,在我们的案例中,所有内容都在我们想要的位置。

        总之,这个表达式会生成名称、日期时间和值的单独数组,但您希望将它们收集到一个数组中。所以把它们放进去。

        [[.name] + (.timer[] | [.datetime, .value])]
        

        当你把它们放在一起时,你会得到你的结果。

        .services.service[] | [[.name] + (.timer[] | [.datetime, .value])]
        

        【讨论】:

          猜你喜欢
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          • 2019-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-11
          相关资源
          最近更新 更多