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

5 java json hashmap deserialization

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

String requestUri = "name=raju&school=abcd&college=mnop&color=black&fruit=mango";
Run Code Online (Sandbox Code Playgroud)

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

String name = "raju";
String school = "abcd";
String college = "mnop";
String color = "black";
String fruit = "mango";
Run Code Online (Sandbox Code Playgroud)

所以我解析请求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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

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

举个例子来获取 的值,school我必须匹配字符串的起点school和下一个起点之间的值&- 这听起来不太好。

  1. 在java中解析查询字符串的更好方法是什么?
  2. 我怎样才能更好地处理以下事情?

我需要从上面的结果中构造另一个哈希映射,如下所示

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);
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*ves 5

简短的回答:每个 HTTP 客户端库都会为你做这件事。

示例:Apache HttpClient 的URLEncodedUtils

String queryComponent = "name=raju&school=abcd&college=mnop&color=black&fruit=mango";
List<NameValuePair> params = URLEncodedUtils.parse(queryComponent, Charset.forName("UTF-8"));
Run Code Online (Sandbox Code Playgroud)

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

然而,据我所知,您的 hashmap 插入正在将新键映射到现有值,因此实际上没有优化,除了可能移动到 Java 8 Stream 以提高可读性/维护和/或丢弃初始 jsonArray 并直接映射到 hashmap。


Mau*_*rry 5

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

    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);
Run Code Online (Sandbox Code Playgroud)