如何使用 jq 流过滤 JSON [重复]

Posted

技术标签:

【中文标题】如何使用 jq 流过滤 JSON [重复]【英文标题】:How to filter JSON using jq stream [duplicate] 【发布时间】:2018-09-14 03:17:58 【问题描述】:

我有一个非常大的 JSON 文件,示例数据如下所示:

"userActivities":"L3ATRosRdbDgSmX75Z":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-19","L3ATSFGrpAYRkIIKqrh":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-20"

我需要在 jq 流中的“localDate”字段上放置一个过滤器,以便输出看起来像以下 JSON:

"L3ATSFGrpAYRkIIKqrh":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-19"

非常感谢任何帮助/指导!

【问题讨论】:

【参考方案1】:

在根据值进行选择时保留键值对的最简单方法是使用with_entries

jq '.userActivities
| with_entries(select(.value.localDate=="2018-01-20"))' input.json

输出


  "L3ATSFGrpAYRkIIKqrh": 
    "deviceId": "60ee32c2fae8dcf0",
    "dow": "Friday",
    "localDate": "2018-01-20"
  

【讨论】:

我正在处理大约 20 GB 的非常大的 JSON,因此正在寻找使用 jq 流的解决方案 问题明确说明答案需要使用--stream @tilde - 最初的问题没有指定--stream,但确实提到了流媒体。在 jq 的上下文中,所谓的“流解析器”(由 --stream 命令行选项启用)和 JSON 文本的“流”之间存在区别。最初的问题提到了一个大文件,没有说明它是单个 JSON 文本还是 JSON 文本流。如果是后者,那么使用流解析器很可能太慢了。【参考方案2】:
jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "userActivities"))) | with_entries(select(.value.localDate=="2018-01-19")) ' input.json

输出:

"L3ATRosRdbDgSmX75Z":"deviceId":"60ee32c2fae8dcf0","dow":"Friday","localDate":"2018-01-19"

【讨论】:

非常感谢,它有效。只是想检查是否有可用的选项,其中过滤器可以放在同一变量的多个值上。例如:localDate in ("2018-01-19", "2018-01-20")? 是的。但语法是这样的:jq -cn --stream 'fromstream(1|truncate_stream(inputs | select(.[0][] == "userActivities"))) | with_entries(select(.value.localDate == ("2018-01-19") or .value.localDate == ("2018-01-20")))

以上是关于如何使用 jq 流过滤 JSON [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java8 流过滤 Map 的键后映射到列表

django-rest-framework框架总结之认证权限限流过滤分页及异常处理

django-rest-framework框架总结之认证权限限流过滤分页及异常处理

jq:json对象的输出数组[重复]

如何使用 jq 从 JSON 中获取键名

如何使用 jq (或其他替代方法)解析 JSON 字符串?