Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Grails将字符串转换为字符串值中带有逗号的映射_String_Grails_Maps - Fatal编程技术网

String 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

我想将字符串转换为grails中的映射。我已经有了一个字符串到映射转换的函数。这是密码

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]

上崩溃。这不是我所希望的答案,因为我必须更改字符串值,但因为它干净且短,所以它起到了作用。这不是我所希望的答案,因为我必须更改字符串值,但由于它干净、短小,因此也能达到目的。