Groovy: isn't there a stringToMap out of the box?

groovy elvis operator
groovy bot
groovy null-safe operator
groovy call
groovy assert
groovy spread operator
groovy string
groovy spaceship operator

as a tcl developer starting with groovy, I am a little bit surprised about the list and map support in groovy. Maybe I am missing something here.

I am used to convert between strings, lists and arrays/maps in tcl on the fly. In tcl, something like

"['a':2,'b':4]".each {key, value -> println key + " " + value}

would be possible, where as in groovy, the each command steps through each character of the string.

This would be much of a problem is I could easily use something like the split or tokenize command, but because a serialized list or map isn't just "a:2,b:4", it is a little bit harder to parse.

It seems that griffon developers use a stringToMap library ( but the example can't cope with the serialized maps either.

So my question is now: what's the best way to parse a map or a list in groovy?

Cheers, Ralf

PS: it's a groovy question, but I've tagged it with grails, because I need this functionality for grails where I would like to pass maps through the URL

Update: This is still an open question for me... so here are some updates for those who have the same problem:

  • when you turn a Map into a String, a .toString() will result in something which can't be turned back into a map in all cases, but an .inspect() will give you a String which can be evaluated back to a map!
  • in Grails, there is a .encodeAsJSON() and JSON.parse(String) - both work great, but I haven't checked out yet what the parser will do with JSON functions (possible security problem)

Not exactly native groovy, but useful for serializing to JSON:

import groovy.json.JsonBuilder
import groovy.json.JsonSlurper

def map = ['a':2,'b':4 ]
def s = new JsonBuilder(map).toString()
println s

assert map == new JsonSlurper().parseText(s)

with meta-programming:

import groovy.json.JsonBuilder
import groovy.json.JsonSlurper

Map.metaClass.toJson   = { new JsonBuilder(delegate).toString() }
String.metaClass.toMap = { new JsonSlurper().parseText(delegate) }

def map = ['a':2,'b':4 ]
assert map.toJson() == '{"a":2,"b":4}'
assert map.toJson().toMap() == map

unfortunately, it's not possible to override the toString() method...

Design patterns in , As of Groovy 1.1, there is a built-in MetaClass which can automatically add properties and methods dynamically. Here is how the example would work using that  Since Groovy will always respond to a mention as a prefix, you can simply use @Groovy prefix to check if the prefix has changed. If it has, then it can quickly be fixed by typing @Groovy prefix reset If you were unable to tag the bot, then it may have been kicked or blocked from viewing the channel you're typing commands in.

You might want to try a few of your scenarios using evaluate, it might do what you are looking for.

def stringMap = "['a':2,'b':4]"
def map = evaluate(stringMap)

assert map.a == 2
assert map.b == 4

def stringMapNested = "['foo':'bar', baz:['alpha':'beta']]"
def map2 = evaluate(stringMapNested)

assert == "bar"
assert map2.baz.alpha == "beta"

Semantics, The switch statement in Groovy is backwards compatible with Java code; so you can fall through cases sharing the same code for multiple matches. One difference  Groovy not responding? You've come to the right place. Is Discord having issues? Check Discord's status page. If there is an ongoing incident, it is likely that the issue is caused by the outage. Is Groovy online? Check the sidebar to see if Groovy is online. If Groovy appears as offline, then something has probably gone horribly wrong.

I think you are looking for a combination of ConfigObject and ConfigSlurper. Something like this would do the trick.

def foo = new ConfigObject() = [ 'a' : 2, 'b' : 4 ]

// we need to serialize it
new File( 'serialized.groovy' ).withWriter{ writer ->
  foo.writeTo( writer )

def config = new ConfigSlurper().parse(new File('serialized.groovy').toURL())    

// highest level structure is a map ["bar":...], that's why we need one loop more
config.each { _,v ->
    v.each {key, value -> println key + " " + value}

Troubleshooting – Groovy Support, Groovy not responding? You've come to the right place. Is Discord having issues​? Check Discord's status page. If there is an ongoing No groovy is not dead, it is still being used in projects like grails. But, please kill the groovy, there is plenty of other JVM language option to consider. The main issue with the groovy is it pushes compile time safety to run time error for the sake of (so-called) simplicity of developer.

If you don't want to use evaluate(), do instead:

def stringMap = "['a':2,'b':4]"
stringMap = stringMap.replaceAll('\\[|\\]','')
def newMap = [:]
stringMap.tokenize(',').each {
kvTuple = it.tokenize(':')
newMap[kvTuple[0]] = kvTuple[1]
println newMap

Why isn't Groovy responding? – Groovy Support, Usually, this is caused by an admin changing the prefix. Since Groovy will always respond to a mention as a prefix, you can simply use The null safe operator is used in the Groovy inject closure so that the first comparsion will work. In Java, it is possible to avoid the isPresent check on the optional by just doing players

I hope this help:

    foo= "['a':2,'b':4]"
    Map mapResult=[:]
    mapResult += foo.replaceAll('\\[|\\]', '').split(',').collectEntries { entry ->
        def pair = entry.split(':')
        [(pair.first().trim()): pair.last().trim()]

Introducing Groovy, For example, take the program shown in Listing 1. Is it a Groovy program or a Java program? Copy. The easiest way to create a global variable in a Groovy script is to assign it anywhere in the script without any special keywords. We don't even need to define the type: x = 200. Then, if we run the following groovy script: x = 200 logger = Logger.getLogger("Scopes.groovy")"- Global variable")

Groovy: When Flower Power Bloomed in Pop Culture: Voger, Mark , Groovy: When Flower Power Bloomed in Pop Culture [Voger, Mark, Morrow, John​, Sekowsky, Mike, Crumb, Robert, Max, Peter] on *FREE*  Groovy 1,163. Other. The best music bot for Discord. Supports Spotify, YouTube, Soundcloud and more! Invite Vote Groovy Commands Prefix: - Visit

Chapter 1. Your way to Groovy · Groovy in Action, Second Edition, It isn't the mountains ahead to climb that wear you out; it's the pebble in your shoe​. Muhammad Ali. You've heard of Groovy, maybe even installed the distribution  I am a long time Java programmer who has learned a few of the follow on languages: Groovy, Scala, and Clojure. Of the three, Groovy is the one I do not use and do not like.

Groovy Interactive Console - Help, If dependencies in your project contain a Groovy library then the specified Groovy library is used to launch the Groovy console. If the dependencies do not contain  This isn't just methods that have been defined on your class. Try: test?.total(2,3) You'll see that it returns. Invoke method total with args: [2, 3] The call to println inside invokeMethod is thus understood as a call to this.println, just like a call to sum would be.