我希望解析一个JSON文件并提取一些值,同时如果某些条目包含作为参数传入的另一个列表中的子字符串,则丢弃或跳过这些条目.其目的是从主列表中排除包含各种人类可读关键字的对象.

Input.json

{
  "entities": [
    {
      "id": 600,
      "name": "foo-001"
    },
    {
      "id": 601,
      "name": "foo-002"
    },
    {
      "id": 602,
      "name": "foobar-001"
    }
  ]
}

Args.json(关键字列表)

"foobar-"
"BANANA"

输出必须包含foo-*个条目(但不包含排除的foobar-个条目),但也可以包含任何其他名称,前提是它们不包含foobar-BANANA.排除将基于子字符串,而不是完全匹配.

我正在寻找一种更好的方式来做这件事,因为目前我只做我的正常过滤器:

    jq '[.[].entities[] | select(.name != "")] | walk(if type == "string" then gsub ("\t";"") else . end)' > file

(输入文件中有一些错误的制表符转义和经过预处理的空字段)

在这个阶段,文件只做了最低限度的准备.然后,我在Shell中逐行迭代该文件,并使用关键字文件中的一长串无效模式调用grep -vf.这提供了一个"主列表",该列表经过清理,以便稍后由其他应用程序进行解析.不过,这似乎在直觉上是错误的.

这似乎应该在第一次与JQ的传球中一举完成,而不是在以后的循环中蛮横地强迫它.

我try 了INDEX--slurpfile的各种调用,但我似乎遗漏了一些东西:

jq '.entities | INDEX(.name)[inputs]' Input.json args.json

上面是一种简单的索引输入参数的方法,它至少似乎演示了文件中的模式可以逐字匹配,但没有考虑子字符串(contains).

jq '.[] | walk(if type == "object" and (.name | contains($args[]))then empty else . end)' --slurpfile args args.json Input.json

这看起来越来越接近这个 idea ,但这里有一些事情是扭曲的.它似乎是在为关键字文件中的参数的每次迭代返回所有输入文件,并为N个参数返回所有输入文件,而不是实际上清空原始输入,只是默默地判断整个文件是否存在单个关键字,然后重新开始.

似乎我需要解开$args[]并以某种方式将其映射到这里,以便输入文件只迭代一次,为每条记录判断每个关键字,而不是一遍又一遍地判断整个文件.

我发现了一些关于slurpfile是否是绝对必要的相互矛盾的信息,并且不能确定这里的最佳方法是什么.

谢谢.

推荐答案

您可以使用all/2,如下所示:

< input.json jq --slurpfile blacklist args.json '
 .entities
 | map(select(.name as $n
       | all( $blacklist[]; . as $b | $n | index($b) | not) ))
'

或者更简洁(但可能不那么明显正确):

.entities | map( select( all(.name; index( $blacklist[]) | not) ))

如果您想保留原来的 struct ,您可能希望改为.entities |= map( ... ).

Json相关问答推荐

Google Page to JSON应用程序脚本出现CORS错误

当由.sh脚本执行时,AWS查询字符串不会提取任何数据

Oracle JSON 查询中的动态列列表

将带有::text[]的JSON数组转换未按预期工作

正向闪烁后的微调值

JOLT 获取带有动态键的数组

如何使用 Google 表格应用程序脚本将 JSON 中的多个字段提取到 Google 表格中

如何为包含一些固定值并可能具有其他附加值的数组字符串创建数组 json 架构

如何从 JSON 对象中获取日期

Flask 请求和 application/json 内容类型

按 JSON 数据类型 postgres 排序

如何使用 C# 将 JSON 文本转换为对象

apple-app-site-association json 文件是否会在应用程序中更新?

字符串的 Gson 数组到 JsonArray

如何按键查找特定的 JSON 值?

使用 Codable 序列化为 JSON 时的 Swift 字符串转义

如何在spark 上将json字符串转换为数据帧

通过 JSON 发送 64 位值的公认方式是什么?

在播放框架 JsObject 中解析 Json 数组

Backbone.js 模型与集合