Vinicius Andrade
Vinicius Andrade

Reputation: 578

Recursively replace value with $path in JQ

Assuming that i have a complex JsonObject

{
  "parent": {
    "name": "value",
    "child": {
      "child_value1": "value",
      "child_value2": "value",
      "child_value3": ["value1","value2"],
      "child_value4": {
         "child_child_value1":"value"
      }
    }
  }
}

I want to replace the value of each key, with the name of key prefixed with $

{
  "parent": {
    "name": "$name",
    "child": {
      "child_value1": "$child_child_value1",
      "child_value2": "$child_child_value2",
      "child_value3": ["$child_child_value3_0","$child_child_value3_1"],
      "child_value4": {
         "child_child_value1":"$child_child_value4_child_child_value1"
      }
    }
  }
}

Is there a way to do it recursively?

EDIT

This is the currently configuration file that I am using

{
  "apis": {
    "order": {
      "base_url": "$mapping_base_url"
    },
    "payment": {
      "base_url": "$admin_base_url"
    }
  },
  "features": {
    "authentication": {
      "authProviders": true,
      "registration": false
    }
  },
  "availableLocales":["en","es"]
}

This is the result using the recomended jq expression:

. |= reduce paths(strings) as $p (.; setpath($p; "$" + ($p | join("_"))))

{
  "apis": {
    "order": {
      "base_url": "$apis_order_base_url"
    },
    "payment": {
      "base_url": "$apis_payment_base_url"
    }
  },
  "features": {
    "authentication": {
      "authProviders": true,
      "registration": false
    }
  },
  "availableLocales": [
    "$availableLocales_0",
    "$availableLocales_1"
  ]
}

Upvotes: 1

Views: 286

Answers (1)

oguz ismail
oguz ismail

Reputation: 50775

You're looking for something like this:

.parent |=
  reduce paths(strings) as $p (.;
    setpath($p; "$" + ($p | join("_")))
  )

Online demo

Upvotes: 1

Related Questions