2017-04-25 163 views
3

我所拥有的就是请求URI,我必须从中解析查询参数。我在做什么是将它们添加到JSON/HashMap和类似下面的如何在java中有效地解析查询参数?

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

为简单起见所有我需要做的就是通过命名来解析查询参数,构建一个HashMap key以不同的方式提交。我怎么能以简单的方式做到这一点?任何帮助都非常感谢。

回答

1

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

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

使用jackson 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); 
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]: "")); 
1

简答:每个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)

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

但是我可以告诉你的hashmap插入是将新键映射到现有的值,所以实际上没有优化,也许为了可读性/维护移动到Java 8流和/或丢弃最初的jsonArray和直接映射到hashmap。