2017-04-25 57 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。