Search code examples
jsongrailsgroovy

How to transform complex json structure using Groovy?


first of all, thanks for your time!

So i've been using Groovy for a couple of weeks now but i can't seems to be able to transform the following json structure:

{
  "collection_1": [
    [
      "value_1",
      "value_2",
      "value_3"
    ],
    [
      "value_1",
      "value_2",
      "value_3",
      "value_4"
    ]
  ],
  "collection_2": [
    [
      "value_1",
      "value_2",
      "value_3",
      "value_4",
      "value_5"
    ]
  ],
  "collection_3": [
    [
      "value_1",
      "value_2"
    ]
  ]
}

To something like:

{
  "collection_1": [
    [
      "value_1": false,
      "value_2": false,
      "value_3": false
    ],
    [
      "value_1": false,
      "value_2": false,
      ...

Here is how i did it:

Map<String, Object> getSelectableItems(Map<String, Object> jsonDeserialized) {
  def selectableItems = [:]

  jsonDeserialized.each { collection, subCollection ->
   selectableItems.put(collection, [:])
   subCollection.eachWithIndex { items, index ->
    selectableItems.get(collection).putAt(index, items.collect { value ->
     [
       "${value}" : false
     ]
    })
   }
  }

  return selectableItems
}
​

I've been trying for days, it isn't that hard, i even succeed but the final code is looking terribly wrong. Do you have any idea of how I could achieve something like so with the power of Groovy?

Thanks groovy pros :D


Solution

  • import groovy.json.*
    
    def data = new JsonSlurper().parseText('''
      {...your json here...}
    ''')
    
    data.replaceAll { k, v -> v = v.collect { it.collectEntries { [it,false] } } }
    
    
    println new JsonBuilder(data).toPrettyString()
    

    output:

    {
        "collection_1": [
            {
                "value_1": false,
                "value_2": false,
                "value_3": false
            },
            {
                "value_1": false,
                "value_2": false,
                "value_3": false,
                "value_4": false
            }
        ],
        "collection_2": [
            {
                "value_1": false,
                "value_2": false,
                "value_3": false,
                "value_4": false,
                "value_5": false
            }
        ],
        "collection_3": [
            {
                "value_1": false,
                "value_2": false
            }
        ]
    }