如何在java中有效地解析查询参数?

时间:2017-04-25 06:08:35

标签: java json hashmap deserialization

我所拥有的是请求URI,我必须从中解析查询参数。我正在做的是将它们添加到json / hashmap并再次获取,如下所示

String requestUri = "name=raju&school=abcd&college=mnop&color=black&fruit=mango";

我所要做的就是最终将它分配给变量,如下面的

String name = "raju";
String school = "abcd";
String college = "mnop";
String color = "black";
String fruit = "mango";

所以我正在解析请求uri,如下所示

String[] paramsKV = requestUri.split("&");
JSONArray jsonKVArr = new JSONArray();
for (String params : paramsKV) {
    String[] tempArr = params.split("=");
    if(tempArr.length>1) {
        String key = tempArr[0];
        String value = tempArr[1];
        JSONObject jsonObj = new JSONObject();
        jsonObj.put(key, value);
        jsonKVArr.put(jsonObj);
     }
 }

另一种方法是在哈希映射中填充相同的内容并获取相同的内容。另一种方法是将requestUri字符串与正则表达式匹配并获得结果。

说一个示例来获取school的值我必须匹配字符串school和下一个&的起点之间的值 - 这不是听起来不错。

  1. 在java中解析查询字符串的更好方法是什么?
  2. 我怎样才能更好地处理以下事情?
  3. 我需要从上面的结果中构建另外一个哈希映射,如

    Map<String, String> resultMap = new HashMap<String, String>;
    
    resultMap.put("empname", name);
    resultMap.put("rschool", school);
    resultMap.put("empcollege", college);
    resultMap.put("favcolor", color);
    resultMap.put("favfruit", fruit);
    

    为简单起见,我所要做的就是解析查询参数并通过不同地命名key字段来构造hashMap。我怎么能以简单的方式做到这一点?非常感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

简短回答:每个HTTP客户端库都会为您执行此操作。 示例:https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/utils/URLEncodedUtils.html#parse(java.lang.String,%20java.nio.charset.Charset)

他们基本上以同样的方式接近它。参数键值对由&分隔,值=分隔,因此字符串&#39; s split适用于两者。

据我所知,但是你的hashmap插入是将新键映射到现有值,因此实际上没有优化,除了为了可读性/维护而转移到Java 8 Stream和/或丢弃初始jsonArray并直接映射到hashmap。

答案 1 :(得分:2)

这是另一种可能的解决方案:

    Pattern pat = Pattern.compile("([^&=]+)=([^&]*)");
    Matcher matcher = pat.matcher(requestUri);
    Map<String,String> map = new HashMap<>();
    while (matcher.find()) {
        map.put(matcher.group(1), matcher.group(2));
    }
    System.out.println(map);

答案 2 :(得分:1)

使用jackson json解析器。 Maven依赖:

$(function() {}

现在使用ObjectMapper从json字符串创建Map:

main.js

答案 3 :(得分:1)

您可以使用Java 8并在一次操作中将数据存储在HashMap中。

Map<String,String> map = Pattern.compile("\\s*&\\s*")
                .splitAsStream(requestUri.trim())
                .map(s -> s.split("=", 2))
                .collect(Collectors.toMap(a -> a[0], a -> a.length > 1 ? a[1]: ""));

答案 4 :(得分:0)

您可以按Jersey库(com.sun.jersey.api.uri.UriComponentorg.glassfish.jersey.uri.UriComponent类)进行操作:

String queryComponent = "name=raju&school=abcd&college=mnop&color=black&fruit=mango";
MultivaluedMap<String, String> params = UriComponent.decodeQuery(queryComponent, true);