首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用JQ将JSON对象生成数组?

如何使用JQ将JSON对象生成数组?
EN

Stack Overflow用户
提问于 2021-05-17 22:41:16
回答 1查看 62关注 0票数 0

这个JSON文件上执行了以下操作

输入

代码语言:javascript
运行
复制
 jq 'with_entries(select([.key] | inside(["adaway", "adguard", "disconnect", "yoyo"])))' adblock.sources

输出

代码语言:javascript
运行
复制
{
  "adaway": {
    "url": "https://raw.githubusercontent.com/AdAway/adaway.github.io/master/hosts.txt",
    "rule": "/^127\\.0\\.0\\.1[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}",
    "size": "S",
    "focus": "mobile",
    "descurl": "https://github.com/AdAway/adaway.github.io"
  },
  "adguard": {
    "url": "https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt",
    "rule": "BEGIN{FS=\"[/|^|\\r]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+[\\/\\^\\r]+$/{print tolower($3)}",
    "size": "L",
    "focus": "general",
    "descurl": "https://adguard.com"
  },
  "disconnect": {
    "url": "https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt",
    "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}",
    "size": "S",
    "focus": "general",
    "descurl": "https://disconnect.me"
  },
  "yoyo": {
    "url": "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=nohtml&showintro=0&mimetype=plaintext",
    "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}",
    "size": "S",
    "focus": "general",
    "descurl": "https://pgl.yoyo.org"
  }
}

我希望它是一个数组,并尝试了一些建议,比如将其导入jq -s '.'。这些尝试只产生一个单一元素数组。什么是最好的方式来格式化这个?我高度怀疑from_entriesto_entries必须以某种方式合并。

预期输出

代码语言:javascript
运行
复制
[
  {
    "key": "adaway",
    "url": "https://raw.githubusercontent.com/AdAway/adaway.github.io/master/hosts.txt",
    "rule": "/^127\\.0\\.0\\.1[[:space:]]+([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($2)}",
    "size": "S",
    "focus": "mobile",
    "descurl": "https://github.com/AdAway/adaway.github.io"
  },
  {
    "key": "adguard",
    "url": "https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt",
    "rule": "BEGIN{FS=\"[/|^|\\r]\"}/^\\|\\|([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+[\\/\\^\\r]+$/{print tolower($3)}",
    "size": "L",
    "focus": "general",
    "descurl": "https://adguard.com"
  },
  {
    "key": "disconnect",
    "url": "https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt",
    "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}",
    "size": "S",
    "focus": "general",
    "descurl": "https://disconnect.me"
  },
  {
    "key": "yoyo",
    "url": "https://pgl.yoyo.org/adservers/serverlist.php?hostformat=nohtml&showintro=0&mimetype=plaintext",
    "rule": "/^([[:alnum:]_-]{1,63}\\.)+[[:alpha:]]+([[:space:]]|$)/{print tolower($1)}",
    "size": "S",
    "focus": "general",
    "descurl": "https://pgl.yoyo.org"
  }
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-17 23:08:37

正如注释中所暗示的那样,有几种方法可以按照最初的要求解释问题,但可以通过在jq筛选器中添加以下内容之一来实现三种主要解释:

代码语言:javascript
运行
复制
| [keys_unsorted[] as $key | {$key} + .[$key] ]

代码语言:javascript
运行
复制
| map(.)

或者:

代码语言:javascript
运行
复制
| [keys_unsorted[] as $key | { $key): .[$key] } ]

更新:第一个是与显示的预期输出相对应的输出。{$key}{"key": $key}的缩写。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67577852

复制
相关文章

相似问题

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