【问题标题】:How to parse query param effectively in java?如何在java中有效地解析查询参数?
【发布时间】:2017-09-22 00:11:51
【问题描述】:

我所拥有的只是请求 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. 我怎样才能更好地处理以下事情?

我需要从上面的结果中构造另一个像下面这样的哈希映射

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。我怎么能以简单的方式做到这一点?非常感谢您提供任何帮助。

【问题讨论】:

    标签: java json hashmap deserialization


    【解决方案1】:

    使用杰克逊 json 解析器。 Maven 依赖:

    <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.5.3</version>
            </dependency>
    

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

    ObjectMapper mapper = new ObjectMapper();
    Map list = mapper.readValue(requestUri, Map.class);
    

    【讨论】:

      【解决方案2】:

      您可以使用 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]: ""));
      

      【讨论】:

        【解决方案3】:

        简短回答:每个 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"));
        

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

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

        【讨论】:

          【解决方案4】:

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

              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);
          

          【讨论】:

            【解决方案5】:

            您可以通过 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);
            

            【讨论】:

              猜你喜欢
              • 2015-06-30
              • 2015-07-03
              • 2011-01-11
              • 2022-09-28
              • 1970-01-01
              • 2012-01-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多