Wow... Kiyotaka Oku's fork of this shows how to do it in one line :-)
The other day, I saw Harold Cooper's One-line tree in Python via autovivication, and wondered if the same thing was possible in Groovy.
The answer is yes! But you need to define the variable tree
before you can assign it to the self-referential withDefault
closure, hence with Groovy, it's a two-line solution ;-)
Anyway, given:
def tree
tree = { -> return [:].withDefault{ tree() } }
We can then do:
users = tree()
users.harold.username = 'hrldcpr'
users.yates.username = 'tim'
And printing this out
println new groovy.json.JsonBuilder( users ).toPrettyString()
gives:
{
"harold": {
"username": "hrldcpr"
},
"yates": {
"username": "tim"
}
}
@hrhristov Yeah, given:
And some JSON representing Users:
Then we can read it into a Map using:
However, if we want to add new branches automatically to this as if it were a tree (as above), then we need something to take a map and decorate all the "branches" as trees
Then, we can get the users like so:
And add to it as before:
which now prints:
Hope this helps :-)