jsonobjectkeycommand-line-interfacejq

Using jq, convert array of objects to object with named keys


Given a json file in the format as :

[
 {
  name : "A",
  value : "1"
 },
 {
  name : "B",
  value : "5"
 },
 {
  name : "E",
  value : "8"
 }
]

How would I convert it to something like this using jq:

{
 "A" : {
   name : "A",
   value : "1"
 },
 "B" : {
  name : "B",
  value : "5"
 },
 "E" : {
  name : "E",
  value : "8"
 }
}

jq '{(.[].name) : "the name"}' 'myfile.json' gets me an object with [].name keys but how do I assign the object to it?


Solution

  • map( { (.name|tostring): . } ) | add
    

    (The tostring is for safety/robustness.)

    INDEX/1

    If your jq has INDEX/1 (introduced in version 1.6), you can simply write:

    INDEX(.name)