首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳过JSON中特定嵌套级别的非数组属性

跳过JSON中特定嵌套级别的非数组属性
EN

Stack Overflow用户
提问于 2020-06-21 00:26:05
回答 2查看 222关注 0票数 0

我正试图从它使用的源列表中检索火狐的黑名单主机,以便我可以将它用于另一个浏览器(Qutebrowser)。

在解析JSON方面,我在jq方面相当成功。

代码语言:javascript
复制
#!/bin/sh
for term in Advertising Content Social Analytics Fingerprinting Cryptomining Disconnect; do
    jq ".categories.$term[][][][]" services.json
done

但是,一些类别中的几个最深对象(它们总是处于相同的嵌套级别)包含了打破jq的额外信息,如下面的"performance": "true"

代码语言:javascript
复制
{
  "categories": {
    ...
    "Cryptomining": [
      {
        "a.js": {
          "http://zymerget.bid": [
            "alflying.date",
            "alflying.win",
            ...
            "zymerget.faith"
          ],
          "performance": "true"
        }
      },
      {
        "CashBeet": {
          "http://cashbeet.com": [
            "cashbeet.com",
            "serv1swork.com"
          ]
        }
      },
      ...

因此,例如,当循环转到jq ".categories.Cryptomining[][][][]" services.json时,它会引发一个错误并停止处理类别:

代码语言:javascript
复制
"alflying.date"
"alflying.win"
...
"zymerget.faith"
jq: error (at servicesN.json:11167): Cannot iterate over string ("true")

有没有办法用jq忽略那些非数组属性?另外,请告诉我是否可以放弃for循环,在一个jq中完成整个过程(因为目前,正如上面所示,我列出了for循环中的所有类别)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-21 02:01:46

有没有办法用jq忽略那些非数组属性?

是的,内建

另外,请告诉我是否可以放弃for循环,在一个jq中完成整个过程(因为目前,正如上面所示,我列出了for循环中的所有类别)。

数组/目标值迭代器是为你做的。

代码语言:javascript
复制
jq '.categories[][][][] | arrays[]' services.json

但是,对于这个特定的任务,您似乎根本不需要arrays;下面的命令产生相同的输出:

代码语言:javascript
复制
jq '.categories[][][][][]?' services.json

.[]?

票数 1
EN

Stack Overflow用户

发布于 2020-06-21 20:46:29

给定的

代码语言:javascript
复制
{
  "categories": {
    "Cryptomining": [
      {
        "a.js": {
          "http://zymerget.bid": [
            "alflying.date",
            "alflying.win",
            "zymerget.faith"
          ],
          "performance": "true"
        }
      },
      {
        "CashBeet": {
          "http://cashbeet.com": [
            "cashbeet.com",
            "serv1swork.com"
          ]
        }
      }
    ]
  }
}

作为嵌套路径的替代方案,您可以使用递归下降:

代码语言:javascript
复制
.. | strings

它产生:

代码语言:javascript
复制
"alflying.date"
"alflying.win"
"zymerget.faith"
"true"
"cashbeet.com"
"serv1swork.com"

若要排除"true“,可以将其设置为布尔值,也可以将不包含.的字符串排除在外:

代码语言:javascript
复制
.. | strings | select(contains("."))

返回:

代码语言:javascript
复制
"alflying.date"
"alflying.win"
"zymerget.faith"
"cashbeet.com"
"serv1swork.com"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62493191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档