使用Java Servlet解析关联数组请求参数

是否可以使用Java servlet API从诸如此类的请求中解析字符串键?

http://localhost:8080/?assocArray[key1]=value1&assocArray[key2]=value2&assocArray[key3]=value3 getParameterValues("assocArray") returns ["value3","value1","value1"] 

返回数组中值的排序不是键的顺序(不重要)

已解决:有可能将键解释为简单的全局键字符串。 Java不会将它们识别为数组。 使用正则表达式

不是直接的。 []在HTTP请求参数中没有特殊含义,并且Servlet API不被识别为数组键(您可能是一个PHP程序员,它确实有一个专有的解析器吗?)。 你需要自己解析并自行收集它。

例如,

 Map assocArray = new LinkedHashMap(); for (Entry entry : request.getParameterMap().entrySet()) { String name = entry.getKey(); if (name.startsWith("assocArray[")) { String key = name.substring(name.indexOf('[') + 1, name.indexOf(']')); assocArray.put(key, entry.getValue()[0]); } } 

对于相同的参数名称,您可能有多个值:

 http://localhost:8080/?param1=value1&param1=value2&param1=value3 

在这种情况下, getParameterValues("param1")将返回一个包含3个元素的String[]"value1""value2""value3"

在您给出的示例中,您定义了3个不同的参数: assocArray[key1]assocArray[key2]assocArray[key3] 。 servlet API将它们视为3个完全不同的参数,没有任何共同点。 因此,您必须调用getParameter("assocArray[key1]")获取"value1"getParameter("assocArray[key2]")获取"value2"等。

不可能,AFAIK。 http协议仅指定键和值,没有key[key]=value

通过索引使用字符串数组 – values[0]values[1]等。

您可以进行一些预处理 – 使用request.getParameterMap(..) ,自己解析foo[bar]语法,并将其放在Map

已解决:有可能将键解释为简单的全局键字符串。 Java不会将它们识别为数组。 使用正则表达式

Java不会将它们识别为数组(元素),因为URL / URI规范并未表示它们代表数组。 您不应该期望 Java(或其他)库实现您基本上已经撤出的自定义语法。

使用正则表达式来解析输入通常是一个坏主意。 对于(完整的)URL,这是一个坏主意,因为URL可以被编码的各种棘手的方式,并且正则表达式很难考虑到这一点。

(如果您使用正则表达式拆分单个请求参数,那么您应该没问题,因为Servlet基础结构已经处理了主URL解析并处理了%-encoding等)


我还想指出你的查询字符串语法是脆弱的。 您正在使用'[‘和’]’字符而不转义它们。 根据URL / URI规范,它们是“保留字符”,并且在用作“数据”时应该被转义。 在大多数情况下,您可能会使用它,但是需要严格符合URI的应用程序将拒绝您的URL。