I want to transform this JSON
{
"property": "value",
"array1": [
{
"name": "A",
"propertyA1": "1",
"propertyA2": "2"
},
{
"name": "B",
"propertyB1": "1",
"array2": [
{
"name": "C",
"propertyC1": "1",
"propertyC2": "2"
}
]
}
]
}
into that using a JQ filter.
{
"property": "value",
"array1": {
"A": {
"propertyA1": "1",
"propertyA2": "2"
},
"B" : {
"propertyB1": "1",
"array2": {
"C" : {
"propertyC1": "1",
"propertyC2": "2"
}
}
}
}
}
The difficulty is to make this work recursively. Moreover, only arrays who
possess an object with a property name should be considered. I had a few attempts but
it already fails if I want to add a new property do the arrays (I know it's not possible,
since it is an array).
You basically want to turn each array into an object with each item's .name field turned into a key. You could use from_entries which requires each key and value as .name (or .key) and .value fields, so all you have to do is to set up a .value without the .name field. walk the document tree to apply this to each array.
walk(arrays |= (map(.value = del(.name)) | from_entries))
{
"property": "value",
"array1": {
"A": {
"propertyA1": "1",
"propertyA2": "2"
},
"B": {
"propertyB1": "1",
"array2": {
"C": {
"propertyC1": "1",
"propertyC2": "2"
}
}
}
}
}