String Grails将字符串转换为字符串值中带有逗号的映射
我想将字符串转换为grails中的映射。我已经有了一个字符串到映射转换的函数。这是密码String Grails将字符串转换为字符串值中带有逗号的映射,string,grails,maps,String,Grails,Maps,我想将字符串转换为grails中的映射。我已经有了一个字符串到映射转换的函数。这是密码 static def StringToMap(String reportValues){ Map result=[:] result=reportValues.replace('[','').replace(']','').replace(' ','').split(',').inject([:]){map,token -> List tokenize
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公司。我在谷歌上搜索了一下,但找不到任何具体的帮助。一般来说,如果我必须将字符串化的地图转换为我尝试使用的地图对象。但是,您的示例字符串不太适合这样做,如果您有以下内容,它将“正常工作”:
如果你可以控制字符串,那么如果你可以按照这种模式创建它,这将是我怀疑的最简单的解决方案。一般来说,如果我必须将字符串化的贴图转换为我尝试使用的贴图对象。但是,您的示例字符串不太适合这样做,如果您有以下内容,它将“正常工作”:
如果您可以控制字符串,那么如果您可以按照这种模式创建它,这将是我怀疑的最简单的解决方案。如果无法更改输入参数,这可能是一个不太干净、不太短的选项。它依赖于冒号而不是逗号值
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}
顺便说一句:仅在受信任的输入上使用eval,否则它将执行所有操作。如果无法更改输入参数,这可能是一个不太干净、不太短的选项。它依赖于冒号而不是逗号值
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}
顺便说一句:仅在可信输入上使用eval,否则它会执行所有操作。您可以尝试使用以下代码:
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]
它对字符串进行标记,然后通过迭代列表并将每个字符串根据
:
再次拆分为一个映射来转换ArrayList。它还必须检查以确保大小大于1,否则它将在f[1]
上断开。您可以尝试处理这段代码:
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]
它对字符串进行标记,然后通过迭代列表并将每个字符串根据
:
再次拆分为一个映射来转换ArrayList。它还必须检查以确保大小大于1,否则它将在f[1]
上崩溃。这不是我所希望的答案,因为我必须更改字符串值,但因为它干净且短,所以它起到了作用。这不是我所希望的答案,因为我必须更改字符串值,但由于它干净、短小,因此也能达到目的。