Bash, чтобы перечислить все пути json

#json #bash

#json #bash

Вопрос:

У меня есть 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
  

Ответ №1:

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

Примечания:

  • cat file | jq бесполезное использование cat . Do jq ... file
  • чтобы преобразовать в массив bash, используйте обычную readarray -t arr < <(jq -r ....)
  • jq имеет довольно эффективный язык программирования. Сначала попробуйте решить проблемы в jq .