Grails在字符串值中使用逗号将String转换为Map

时间:2017-07-27 07:00:45

标签: string grails maps

我希望将字符串转换为Grails中的Map。我已经有一个字符串功能来映射转换。这是代码,

static def StringToMap(String reportValues){
    Map result=[:]
         result=reportValues.replace('[','').replace(']','').replace('  ','').split(',').inject([:]){map,token ->
            List tokenizeStr=token.split(':');
            tokenizeStr.size()>1?tokenizeStr?.with {map[it[0]?.toString()?.trim()]=it[1]?.toString()?.trim()}:tokenizeStr?.with {map[it[0]?.toString()?.trim()]=''}
            map
        }
   return result
    }

但是,我在值中有逗号的字符串,所以上面的函数对我不起作用。继承人我的字符串

[program_type:, subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC, INC]

我的函数只返回ABC。不是ABC,INC。我搜索了它,但找不到任何具体的帮助。

3 个答案:

答案 0 :(得分:1)

一般来说,如果我必须将Stringified Map转换为Map对象,我会尝试使用Eval.me。您的示例字符串虽然不是很正确,但如果您有以下情况,那么#34;只是工作":

// Note I have added '' around the values.
​String a = "[program_type:'', subsidiary_code:'', groupName:'', termination_date:'', effective_date:'', subsidiary_name:'ABC']"
Map b = Eval.me(a)​
// returns b = [program_type:, subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC]

如果您控制了String,那么如果您可以按照这种模式创建它,那么这将是我怀疑的最简单的解决方案。

答案 1 :(得分:1)

如果无法更改输入参数,则可能不是那么干净且不那么短的选项。它依赖于冒号而不是逗号值。

​String reportValues = "[program_type:, subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC, INC]"
reportValues = reportValues[1..-2]
def m = reportValues.split(":")
def map = [:]
def length = m.size()
m.eachWithIndex { v, i ->
    if(i != 0) {
        List l = m[i].split(",")
        if (i == length-1) {
             map.put(m[i-1].split(",")[-1], l.join(","))
        } else {
             map.put(m[i-1].split(",")[-1], l[0..-2].join(","))
        }
    }
}
map.each {key, value -> println "key: " + key + " value: " + value}

BTW:只在可信输入上使用eval,AFAIK才能执行所有操作。

答案 2 :(得分:0)

你可以尝试搞乱这段代码:

String tempString = "[program_type:11, 'aa':'bb', subsidiary_code:, groupName:, termination_date:, effective_date:, subsidiary_name:ABC, INC]"
        List StringasList = tempString.tokenize('[],')
        def finalMap=[:]
        StringasList?.each { e->
             def f = e?.split(':')
             finalMap."${f[0]}"= f.size()>1 ? f[1] : null

        }
        println """--  tempString: ${tempString.getClass()} StringasList: ${StringasList.getClass()}
                        finalMap: ${finalMap.getClass()} \n Results\n finalMap ${finalMap}
            """

以上产生:

--  tempString: class java.lang.String StringasList: class java.util.ArrayList
                        finalMap: class java.util.LinkedHashMap 
 Results
 finalMap [program_type:11,  'aa':'bb',  subsidiary_code:null,  groupName:null,  termination_date:null,  effective_date:null,  subsidiary_name:ABC,  INC:null]

它对String进行标记,然后通过遍历列表并将每个对象分别转移到映射中来转换ArrayList。它还必须检查以确保大小大于1,否则它将在:

中断