我希望将字符串转换为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。我搜索了它,但找不到任何具体的帮助。
答案 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,否则它将在: