首页 > 解决方案 > Bash 列出所有 json 路径

问题描述

我有一个json文件,我想列出上面的所有路径。例如:appsettings.json 文件:

{
  "foo": "bar",
  "zuzu": {
    "lele": "lala"
  },
  "eita": [
    {
      "oxe": "right"
    }
  ]
}

预期的结果是一个包含(作为 bash 变量)的数组:

[
  "foo",
  "zulu",
  "zuzu.lele",
  "eita",
  "eita.0",
  "eita.0.oxe"
]

我已经尝试了以下方法,jq但我无法迭代jq结果,我一无所知。

#!/bin/bash
join() {
    # $1 is return variable name
    # $2 is sep
    # $3... are the elements to join
    local retname=$1 sep=$2 ret=$3
    shift 3 || shift $(($#))
    printf -v "$retname" "%s" "$ret${@/#/$sep}"
}

jsonPaths=$(cat j.json | jq 'path(..)')

for path in $jsonPaths; do
  join pathString "." "${path[@]}"
  echo $path
done

标签: jsonbash

解决方案


$ jq '[ path(..) | join(".") ] | del(.[0])' /tmp/2.json
[
  "foo",
  "zuzu",
  "zuzu.lele",
  "eita",
  "eita.0",
  "eita.0.oxe"
]

笔记:

  • cat file | jq是无用的使用cat。做jq ... file
  • 要转换为 bash 数组,请使用通常的readarray -t arr < <(jq -r ....)
  • jq拥有相当强大的编程语言。首先尝试解决中的问题jq

推荐阅读