首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建JSON的叶子路径?

如何创建JSON的叶子路径?
EN

Stack Overflow用户
提问于 2017-10-29 20:28:01
回答 3查看 386关注 0票数 3

假设我们有以下JSON:

代码语言:javascript
复制
[
  {
    "dir-1": [
      "file-1.1",
      "file-1.2"
    ]
  },
  "dir-1",
  {
    "dir-2": [
      "file-2.1"
    ]
  }
]

我们想要得到下一个输出:

代码语言:javascript
复制
  "dir-1/file-1.1"
  "dir-1/file-1.2"
  "dir-1"
  "dir-2/file-2.1"

即,获取到所有leafs的路径,将项目与/连接起来。有没有办法在JQ上做到这一点?

我试过这样的方法:

代码语言:javascript
复制
cat source-file | jq 'path(..) | [ .[] | tostring ] | join("/")'

但它不会产生我所需要的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-29 20:43:02

您可以通过将路径与其值合并来利用流的工作方式。流只对叶值发出path, value对。忽略编号的索引。

代码语言:javascript
复制
$ jq --stream '
select(length == 2) | [(.[0][] | select(strings)), .[1]] | join("/")
' source-file

返回:

代码语言:javascript
复制
"dir-1/file-1.1"
"dir-1/file-1.2"
"dir-1"
"dir-2/file-2.1"
票数 3
EN

Stack Overflow用户

发布于 2017-10-29 22:04:11

这里有一个类似于杰夫·默卡多的解决方案,它使用tostreamflatten

代码语言:javascript
复制
tostream | select(length==2) | .[0] |= map(strings) | flatten | join("/")

在jqplay.org网上试用

另一种方法是使用递归函数来遍历输入,如

代码语言:javascript
复制
def slashpaths($p):
  def concat($p;$k): if $p=="" then $k else "\($p)/\($k)" end;
  if   type=="array"  then .[] | slashpaths($p)
  elif type=="object" then
       keys_unsorted[] as $k
     | .[$k] | slashpaths(concat($p;$k))
  else concat($p;.) end;
slashpaths("")

在tio.run网上试试吧!

票数 0
EN

Stack Overflow用户

发布于 2017-10-29 22:07:25

使用--stream很好,但下面的内容可能不那么深奥:

代码语言:javascript
复制
paths(scalars) as $p
| getpath($p) as $v
| ($p | map(strings) + [$v])
| join("/")

(如果使用JQ1.4或更早版本,如果任何叶子可能是数字、布尔值或null,那么上面的[$v]应该替换为[$v|tostring])。

结果是否应该被视为“落叶之路”则是另一回事.

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

https://stackoverflow.com/questions/47004904

复制
相关文章

相似问题

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