Java中的查询字符串操作

gri*_*egs 17 java string

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

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

提前致谢.

编辑

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

N=123+456+112&Ntt=koala&D=abc
Run Code Online (Sandbox Code Playgroud)

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

String[] N = queryStringClass.getParameter("N");
Run Code Online (Sandbox Code Playgroud)

然后也许吧

queryStringClass.setParameter("N", N);
Run Code Online (Sandbox Code Playgroud)

有可能 queryStringClass.removeParameter("N");

或者那种效果.

Mau*_*ara 16

这样的事情

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

要简单地迭代地图:

 String query = url.getQuery();  
 Map<String, String> map = getQueryMap(query);  
 Set<String> keys = map.keySet();  
 for (String key : keys)  
 {  
    System.out.println("Name=" + key);  
    System.out.println("Value=" + map.get(key));  
 }  
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不考虑转义字符. (8认同)

lau*_*man 12

您也可以使用Google Guava的Splitter.

String queryString = "variableA=89&variableB=100";
Map<String,String> queryParameters = Splitter
    .on("&")
    .withKeyValueSeparator("=")
    .split(queryString);
System.out.println(queryParameters.get("variableA"));
Run Code Online (Sandbox Code Playgroud)

打印出来

89
Run Code Online (Sandbox Code Playgroud)

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

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

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

a=%26%23%25!)%23(%40!&b=%23%24(%40)%24%40%40))%24%23%5E*%26
Run Code Online (Sandbox Code Playgroud)

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

a = %26%23%25!)%23(%40!
b = %23%24(%40)%24%40%40))%24%23%5E*%26
Run Code Online (Sandbox Code Playgroud)

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

a = &#%!)#(@!
b = #$(@)$@@))$#^*&
Run Code Online (Sandbox Code Playgroud)

这应该涵盖所有情况.

  • 此解决方案不考虑转义字符. (6认同)

Avi*_*Avi 5

如果您使用的是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<KVP> query = new ArrayList<KVP>();

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<String> getParameterValues(String key) {
    List<String> list = new LinkedList<String>();
    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"));
}
}
Run Code Online (Sandbox Code Playgroud)