2017-04-25 2 views
3

내가 가지고있는 것은 쿼리 매개 변수를 구문 분석해야하는 요청 URI입니다. 내가하고 있어요 것은 JSON/해시 맵에 추가하고 내가 할 일은 마침내 그래서 나는 다음과 같은java에서 쿼리 매개 변수를 효과적으로 구문 분석하는 방법은 무엇입니까?

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

처럼 변수에 할당하는 것입니다 다음

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

처럼 다시 가져 오는 것입니다 다음과 같은 요청을 파싱합니다.

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

간단 내가 할 일은이 이름을 지정하여 해시 맵을 쿼리 PARAM을 분석하고 구성하는 것입니다 수 있도록처럼 위의 결과에서 다음과 같이 또 다른 해시 맵을 구성 할 필요가 key이 다르게 출원되었습니다. 나는 어떻게 그것을 간단한 방식으로 할 수 있을까? 이 모든 도움은 많이 감사하겠습니다.

답변

1

다른 가능한 해결책
1

jackson json 파서를 사용하십시오. 메이븐 의존성 :

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

지금 JSON 문자열에서지도를 만들 수 ObjectMapper를 사용

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

당신은 자바 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)

그들은 기본적으로 같은 방식으로 접근하고 있습니다. 매개 변수 키 - 값 쌍은 &으로, 키는 =으로 구분되므로 문자열의 split이 둘 모두에 적합합니다.

그러나 해시 맵 삽입은 새 값을 기존 값에 매핑하므로 실제로는 자바 8 스트림으로 이동하여 가독성/유지 관리 및/또는 초기 jsonArray를 무시하고 똑바로 매핑하는 것을 제외하고는 최적화가 없습니다. 해시 맵에.

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); 
: 여기
관련 문제