jq --stream 解析 json 所需的帮助

Posted

技术标签:

【中文标题】jq --stream 解析 json 所需的帮助【英文标题】:jq --stream help needed to parse json 【发布时间】:2018-09-03 02:12:53 【问题描述】:

我有一个非常大的 JSON 文本,需要使用

进行解析
jq --stream 

但是,没有详细的用例或博客可以理解这一点。

JSON结构如下:


  "userActivities": 
    "-----P9E3PJB5bTO1xrO": 
      "aaid": "84dae6bd-cb3a-409c-9940-844f035b5fc7",
      "callsign": "2day",
      "deviceId": "1b771f137d1bc6ea",
      "dow": "Thursday",
      "downloadFlag": "N",
      "email": "ckcafeandcatering@gmail.com",
      "emailSha256": "6ab0992297a9478be9ae7ff26d811b1116c45a0c819ff1c9628c9b7ca4ec4129",
      "event": "streamStop",
      "firebaseUID": "anvlMojJFvQEvMXQW6GeRzLKCIA2",
      "halfHourFull": "10h1",
      "liveFlag": "Y",
      "localDate": "1970-01-01",
      "localHalfHour": 1,
      "login": "google",
      "minutesSinceMidnight": 601,
      "quarterHourFull": "10q1",
      "stationName": "2DayFM104.1"
    ,
    "-GuGCJDEprMKczAMDUj8": 
      "deviceId": "399a649c6cee6209",
      "dow": "Thursday",
      "downloadFlag": "N",
      "event": "streamStart",
      "halfHourFull": "18h1",
      "liveFlag": "Y",
      "localDate": "2009-01-01",
      "localHalfHour": 1,
      "minutesSinceMidnight": 1080,
      "quarterHourFull": "18q1",
      "stationName": "hit 105",
      "streamListenMethod": "Headphones",
      "timestampLocal": "2009-01-01T18:00:33.679+10:00",
      "timestampUTC": "2009-01-01T08:00:33.679Z"
    
  

我想在 localDate 上放置一个过滤器,即只选择那些 localDate = '2009-01-01' 的数组。

目前,我将我的 JSON 提供给以下命令,它会提供所有数组。

jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "userActivities") | del(.[0][0])))'

如何放置过滤器?请建议。非常感谢任何帮助。

【问题讨论】:

请遵循minimal reproducible example 准则。此外,如果您使用数组和对象的标准 JSON 术语修改问题的措辞,将会很有帮助。 【参考方案1】:

使用现有模板的输出:

添加此过滤器:

  select(.localDate == "2009-01-01")

所以你修改后的命令变成:

jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "userActivities") | del(.[0][0]))) <strong>| select(.localDate == "2009-01-01")</strong>'

【讨论】:

感谢您的意见。您能否准确解释路径和叶值是如何工作的。我找不到任何好的文档。例如:.[0][0] 是如何对应“userActivities”的? 好的。我以为你的过滤器是故意的。 .[0][0]userActivities 的原因是因为 userActivities 是 JSON 对象的第二个顶层,一旦您流式传输输入,[0] 代表外部 [0][0] 之间的所有内容代表第一个索引中的所有内容。在这种情况下,您只有userActivities,因此流将有[[0,0],"userActivities"]。过滤器从userActivities 对象中删除任意(即"-----P9E3PJB5bTO1xrO")值,然后仅返回匹配的对象作为按日期过滤的***对象。 非常感谢您的解释。非常感谢。所以,如果我理解正确,那么在下面提到的 JSON 中,关键用户应该是 [0][1]。我是对的吗?“userActivities”:“-----P9E3PJB5bTO1xrO”:“aaid”:“84dae6bd-cb3a-409c-9940-844f035b5fc7”,“用户”:“-----xyz ": "email": "abc@gmail.com" , "-----abc": "email": "xyz@gmail.com"

以上是关于jq --stream 解析 json 所需的帮助的主要内容,如果未能解决你的问题,请参考以下文章

换行分隔 JSON 格式所需的解析过滤器

使用jsoup抓取和解析网页数据

使用--stream将相当大的对象扩展为较小的对象

使用 Java 8 Streams 从列表中仅获取所需的对象

org.springframework.beans.BeansException 类型无法解析。它是从所需的 .class 文件中间接引用的

Linux中解析json---jq