MikeyR
MikeyR

Reputation: 5

add a parameter name to a json file with jq

I am trying to make my json file that looks like this

{
    "database_details": {
    "age": "false",
    "help": "xxxx",
    "host": "",
    "servername": "fra02",
    "db_name": "config_tools",
    "pass": "xxxx",
    "user": "default",

  },
  {
     "age": "false",
    "help": "xxxx",
    "host": "",
    "servername": "fra03",
    "db_name": "config_tools",
    "pass": "xxxx",
    "user": "default",
  }
}

to look like

{
"database_details": {
"fra02":{
    "age": "false",
    "help": "xxxx",
    "host": "",
    "servername": "fra02",
    "db_name": "config_tools",
    "pass": "xxxx",
    "user": "default",
},
"fra03": {
  "age": "false",
    "help": "xxxx",
    "host": "",
    "servername": "fra02",
    "db_name": "config_tools",
    "pass": "xxxx",
    "user": "default",
}
}
}

I have tried jq but not sure if that is the right approach? I have thought about using awk or sed but not sure that is the cleanest route?

Upvotes: 0

Views: 158

Answers (1)

chepner
chepner

Reputation: 531165

Assuming valid JSON like

{
  "database_details": [
     {
       "age": "false",
       "help": "xxxx",
       "host": "",
       "servername": "fra02",
       "db_name": "config_tools",
       "pass": "xxxx",
       "user": "default"
     },
     {
       "age": "false",
       "help": "xxxx",
       "host": "",
       "servername": "fra03",
       "db_name": "config_tools",
       "pass": "xxxx",
       "user": "default"
     }
  ]
}

you can use the filter

.database_details |= (map({key: .servername, value: .}) | from_entries)

The array associated with database_details is turned into an array of key/value pairs, which from_entries turns into a new object that |= assigns back to the key database_details in the original object.

Upvotes: 1

Related Questions