【问题标题】:Filter an array of JSON objects using a regex test condition使用正则表达式测试条件过滤 JSON 对象数组
【发布时间】:2020-07-18 08:02:26
【问题描述】:

我经常收到发送给我的 HAR 文件(JSON),看起来像这样:

{
    "log": {
        "entries" : [
            {
                "request" : {
                    "url" : "test.css"
                }
            },
            {
                "request" : {
                    "url" : "test.ok"
                }
            },
            {
                "request" : {
                    "url" : "test.font"
                }
            },
            {
                "request" : {
                    "url" : "ok"
                }
            }
        ]
    }
}

我不关心包含字体、CSS 或 JavaScript 的 URL 的请求。所以,我想使用jq 删除这些请求。鉴于 @iain-samuel-mclean-elder 中关于过滤和维护输入的 JSON 结构的 answer,我希望这样的事情能够奏效:

jq '[ .[] | select(.log.entries[].request.url | test("\\.(js|css|font)") | not) ]' < MyGoodHarFile.json

然而,这会产生错误:

jq: error (at <stdin>:25): Cannot iterate over null (null)

我做错了什么?如何使用jq 创建一个有效的 HAR 文件,排除对这些特定匹配 URL 的请求?

【问题讨论】:

    标签: json regex select jq


    【解决方案1】:

    您应该非常小心select 语句的使用位置和方式。避免原始过滤器中父路径.[]不正确的错误

    [select(.log.entries[].request.url | test("\\.(js|css|font)") | not)] 
    

    将产生整个输入两次,因为过滤器为您的两个对象断言true,因为select() 复制了true 条件下的整个输入。

    由于执行.log.entries|=,您的输入现在仅在对象数组上,当通过正则表达式断言true 时,这些对象数组被保留,其他对象被排除。

    jq '.log.entries |= ( map ( select ( .request.url | test("\\.(js|css|font)") |not ) ) )'
    

    【讨论】:

    • 非常感谢,@inian!我在 map 之前删除了额外的( 以尽量保持它尽可能简单。不过效果很好。感谢您的解释和帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2016-07-25
    • 2011-04-17
    相关资源
    最近更新 更多