Java中的查询字符串操作

有没有人拥有或知道我可以用来操作查询字符串的java类?

基本上我想要一个类,我可以简单地给一个查询字符串,然后删除,添加和修改查询字符串KVP。

提前致谢。

编辑

在回答对此问题的评论时,查询字符串将看起来像这样;

N=123+456+112&Ntt=koala&D=abc 

所以我想把这个类传递给查询字符串并说出类似的内容。

 String[] N = queryStringClass.getParameter("N"); 

然后也许吧

 queryStringClass.setParameter("N", N); 

也许是queryStringClass.removeParameter("N");

或者那种效果。

这样的事情

  public static Map getQueryMap(String query) { String[] params = query.split("&"); Map map = new HashMap(); for (String param : params) { String name = param.split("=")[0]; String value = param.split("=")[1]; map.put(name, value); } return map; } 

要简单地迭代地图:

  String query = url.getQuery(); Map map = getQueryMap(query); Set keys = map.keySet(); for (String key : keys) { System.out.println("Name=" + key); System.out.println("Value=" + map.get(key)); } 

您也可以使用Google Guava的Splitter。

 String queryString = "variableA=89&variableB=100"; Map queryParameters = Splitter .on("&") .withKeyValueSeparator("=") .split(queryString); System.out.println(queryParameters.get("variableA")); 

打印出来

 89 

我认为这是一个非常可读的替代解决方案。

编辑:正如@raulk所指出的,此解决方案不考虑转义字符。 但是,这可能不是问题,因为在URL-Decode之前,查询字符串保证不会有任何与’=’和’&’冲突的转义字符。 您可以通过以下方式将此用于您的优势。

假设您必须解码以下查询字符串:

 a=%26%23%25!)%23(%40!&b=%23%24(%40)%24%40%40))%24%23%5E*%26 

这是URL编码,然后保证’&’和’=’分别专门用于分离对和键的值,此时您可以使用Guava分割器来获取:

 a = %26%23%25!)%23(%40! b = %23%24(%40)%24%40%40))%24%23%5E*%26 

获得键值对后,您可以单独对它们进行URL解码。

 a = &#%!)#(@! b = #$(@)$@@))$#^*& 

这应该涵盖所有情况。

如果您使用的是J2EE,则可以使用ServletRequest.getParameterValues() 。

否则,我认为Java没有任何用于查询字符串处理的公共类。 编写自己的应该不会太难,尽管存在某些棘手的边缘情况,例如在技术上认识到相同的密钥可能在查询字符串中出现多次。

一种实现可能如下所示:

 import java.util.*; import java.net.URLEncoder; import java.net.URLDecoder; public class QueryParams { private static class KVP { final String key; final String value; KVP (String key, String value) { this.key = key; this.value = value; } } List query = new ArrayList(); public QueryParams(String queryString) { parse(queryString); } public QueryParams() { } public void addParam(String key, String value) { if (key == null || value == null) throw new NullPointerException("null parameter key or value"); query.add(new KVP(key, value)); } private void parse(String queryString) { for (String pair : queryString.split("&")) { int eq = pair.indexOf("="); if (eq < 0) { // key with no value addParam(URLDecoder.decode(pair), ""); } else { // key=value String key = URLDecoder.decode(pair.substring(0, eq)); String value = URLDecoder.decode(pair.substring(eq + 1)); query.add(new KVP(key, value)); } } } public String toQueryString() { StringBuilder sb = new StringBuilder(); for (KVP kvp : query) { if (sb.length() > 0) { sb.append('&'); } sb.append(URLEncoder.encode(kvp.key)); if (!kvp.value.equals("")) { sb.append('='); sb.append(URLEncoder.encode(kvp.value)); } } return sb.toString(); } public String getParameter(String key) { for (KVP kvp : query) { if (kvp.key.equals(key)) { return kvp.value; } } return null; } public List getParameterValues(String key) { List list = new LinkedList(); for (KVP kvp : query) { if (kvp.key.equals(key)) { list.add(kvp.value); } } return list; } public static void main(String[] args) { QueryParams qp = new QueryParams("k1=v1&k2&k3=v3&k1=v4&k1&k5=hello+%22world"); System.out.println("getParameter:"); String[] keys = new String[] { "k1", "k2", "k3", "k5" }; for (String key : keys) { System.out.println(key + ": " + qp.getParameter(key)); } System.out.println("getParameters(k1): " + qp.getParameterValues("k1")); } } 

另一种方法是使用apache http-components。 它有点hacky,但至少你利用所有的解析角案例:

 List params = URLEncodedUtils.parse("http://example.com/?" + queryString, Charset.forName("UTF-8")); 

这将为您提供一个易于使用的NameValuePair对象列表。

您可以创建一个util方法并使用正则表达式来解析它。 像“[;&]”这样的模式就足够了。