jq: Getting two levels of keys

Use map_values instead of map to map the values of a JSON object while preserving the keys:

jq '.p | map_values(keys)'

On jq versions lower than 1.5, map_values is not defined: instead, you can use []|=:

jq '.p | . []|= keys'

In general

Top level keys:

curl -s https://crates.io/api/v1/crates/atty | jq '. |= keys'

[
  "categories",
  "crate",
  "keywords",
  "versions"
]

Two levels of keys:

curl -s https://crates.io/api/v1/crates/atty | jq '.| map_values(keys)'

{
  "crate": [
    "badges",
    "categories",
    "created_at",
    "description",
    "documentation",
    "downloads",
    "exact_match",
    "homepage",
    "id",
    "keywords",
    "links",
    "max_version",
    "name",
    "newest_version",
    "recent_downloads",
    "repository",
    "updated_at",
    "versions"
  ],
  "versions": [
    0,
    1,
    2,
    3,
    4,
    5,
    6,
    7,
    8,
    9,
    10,
    11,
    12,
    13,
    14,
    15,
    16
  ],
  "keywords": [
    0,
    1,
    2
  ],
  "categories": []
}

Method versions

topLevelJsonKeys() {
 curl -s $1 | jq '. |= keys'
  # EXAMPLE: 
  # topLevelJsonKeys https://crates.io/api/v1/crates/atty
}

topLevelJsonKeys2() {
  curl -s $1 | jq '.| map_values(keys)'
  # EXAMPLE: 
  # topLevelJsonKeys2 https://crates.io/api/v1/crates/atty
}

Tags:

Jq