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 所需的帮助的主要内容,如果未能解决你的问题,请参考以下文章
使用 Java 8 Streams 从列表中仅获取所需的对象
org.springframework.beans.BeansException 类型无法解析。它是从所需的 .class 文件中间接引用的