我有一个Java页面( HashMap<String,String> ),它是通过Spring (itemTypesByKey)提供的,还有一个单独的结构,其中包含一个键列表。(这些键可能导致或不可能导致有效的查找。)我对这些键进行枚举,并从映射中捕获值。
Map<String, String> itemTypes = new HashMap<>();
itemTypes.put("NormalValue", "INGREDIENT");
itemTypes.put("Apostro'Value", "INGREDIENT");
ModelAndView mav = ...
mav.addObject("itemTypesByKey", itemTypes);我看到的问题是,如果我的键包含一个撇号,查找就会失败。
我的代码(用于调试):
Key Name: ${currentKeyName}
Not Empty: ${not empty itemTypesByKey[currentKeyName]}
Type: ${itemTypesByKey[currentKeyName]}
All Suite Types: ${itemTypesByKey}最后打印两个单独的键:
Key Name: NormalValue
Not Empty: true
Type: INGREDIENT
All Suite Types: {NormalValue=INGREDIENT, Apostro'Value=INGREDIENT}
Key Name: Apostro'Value
Not Empty: false
Type:
All Suite Types: {NormalValue=INGREDIENT, Apostro'Value=INGREDIENT}当撇号用于查找值时,我理解转义撇号文字,但是如果我的键包含撇号,为什么会失败呢?无论键的值是否包含特殊字符,如何安全地在映射中执行查找?
编辑:我使用的是SpringVersion3.1.4 (mvc、等),这个问题不影响包含感叹号的键或其他我可以考虑测试的特殊字符。
发布于 2016-03-15 21:32:47
下面是一些测试和结果。为了在键内使用撇号,必须使用两个单引号。最重要的是,键中有单引号或特殊字符(感叹号、双引号等)需要有单引号围绕着它。底线是用单引号包围您的键&如果您的键中有一个单引号,请使用两个单引号。
public static void main(String[] args) {
ExpressionParser parser = new SpelExpressionParser();
Map<String,String> itemTypes = (Map) parser.parseExpression("{NormalValue:'INGREDIENT',ApostroValue:'INGREDIENT'}").getValue();
for (Map.Entry<String, String> e : itemTypes.entrySet())
System.out.println(e.getKey() + ": " + e.getValue());
}打印键和值
parseExpression("{NormalValue:'INGREDIENT',Apostro'Value:'INGREDIENT'}")线程"main“org.springframework.expression.spel.SpelParseException: EL1046E:(pos 51):无法找到终止字符串中的异常
parseExpression("{NormalValue:'INGREDIENT',Apostro''Value:'INGREDIENT'}")线程"main“org.springframework.expression.spel.SpelParseException: EL1043E:(pos 33)中的异常:意外令牌。预期的‘冒号(:)’但是是'literal_string‘
parseExpression("{NormalValue:'INGREDIENT','Apostro''Value':'INGREDIENT'}")版画精细
parseExpression("{NormalValue:'INGREDIENT',Apostro\"Value:'INGREDIENT'}")线程"main“org.springframework.expression.spel.SpelParseException: EL1045E:(pos 33):找不到终止字符串中的异常
parseExpression("{NormalValue:'INGREDIENT','Apostro\"Value':'INGREDIENT'}")版画精细
parseExpression("{NormalValue:'INGREDIENT',Apostro!Value:'INGREDIENT'}")线程"main“org.springframework.expression.spel.SpelParseException: EL1043E:(pos 33)中的异常:意外令牌。预期‘冒号(:)’但不是‘(!)’
parseExpression("{NormalValue:'INGREDIENT','Apostro!Value':'INGREDIENT'}")版画精细
https://stackoverflow.com/questions/35725400
复制相似问题