2013-03-03 7 views
0

아래 코드에서 colDataJSON String입니다. colData-정규 표현식을 사용하여 JSON 문자열과 문자열 일치

샘플 예

{ "LV": [{ "V"{ "tenureSiteReg"널 "bghtItms"48 "pnlValue": 105.478409, "byrSgmnt"2 "cstmrId" : "814296998", "slrRevRnk": - 99.0, "soldItms": 0, "slrSgmnt": 6, "byrRevRnk": 0.013, "mainAcct": 78, "gmv": 0.0, "cstmrRevRnk": 0.021, "pnlRev "313.438843"cstmrSgmnt "51"GMB "4674.76"totalVal ": 142.536293,"userId를 "493},"CN ": 42},"LMD "20130}

지금 위의 JSON StringuserId 값과 id 값을 일치 시키려고합니다. id 값이 493 인 경우 위의 JSON 문자열에서 userId 값은 493이어야합니다. JSON 문자열에는 userId values이 많이있을 수 있으므로 userId 값은 모두 id과 일치해야합니다. 일치하지 않는 경우 예외를 기록하십시오.

그래서 나는 this-

private static final Pattern USER_ID_PATTERN = Pattern.compile("userId:\\d+"); 

for (String str : colData) { 
    Matcher matcher = USER_ID_PATTERN.matcher(str); 

     while (matcher.find()) { 
      if (!matcher.group().equals("userId:"+id)) 
       System.out.println("LOG exception"); 

      } 
} 

같은 것을 시도하고 있었다 그러나 JSON 문자열 위, 그것은 또한 내부 while loop을하려고하지 않습니다. 내가 누락 된 것이 있습니까?

어떤 생각이든 도움이 될 것입니다.

+4

* 내가 놓친 게 있나요 *는 JSON 파서, 아마? –

+0

@HotLicks, 위의 시나리오를 달성하기 위해 예제를 제공 할 수 있습니까? – AKIWEB

+0

JSON을지도로 파싱합니다. 지도에서 "lv"배열의지도를 찾습니다. 배열을 반복하고 다른 맵인 "v"요소를 찾습니다. 해당 맵에서 "userId"요소를 찾습니다. –

답변

2

합니다. 이 경우 JSON 프로세서를 사용해야합니다. Jackson JSON Processor을 사용하는 기본적인 예가 있습니다. 보지 않았으므로 id은 별개의 문자열입니다 JSON에서.

import java.io.IOException; 
import java.util.List; 

import org.codehaus.jackson.JsonNode; 
import org.codehaus.jackson.JsonProcessingException; 
import org.codehaus.jackson.map.ObjectMapper; 

class Test { 
    public static void main(String[] args) { 
     String json = "{\"lv\":[{\"v\":{\"tenureSiteReg\":null,\"bghtItms\":48," + 
       "\"pnlValue\":105.478409,\"byrSgmnt\":2,\"cstmrId\":\"814296998\",\"slrRevRnk\":-99.0," + 
       "\"soldItms\":0,\"slrSgmnt\":6,\"byrRevRnk\":0.013,\"mainAcct\":78,\"gmv\":0.0," + 
       "\"cstmrRevRnk\":0.021,\"pnlRev\":313.438843,\"cstmrSgmnt\":51,\"gmb\":4674.76," + 
       "\"totalVal\":142.536293,\"userId\":493},\"cn\":42}],\"lmd\":20130}"; 
     String id = "493"; 

     ObjectMapper mapper = new ObjectMapper(); 

     try { 
      JsonNode rootNode = mapper.readTree(json); 
      List<JsonNode> userIds = rootNode.findValues("userId");   
      for (JsonNode node : userIds) 
      { 
       if (!id.equals(node.toString())) { 
        System.out.println("Log exception: id "+id+" != userId "+node); 
        break; 
       } else { 
        System.out.println("Congratulations! id "+id+" = userId "+node); 
       }    
      } 
     } catch (JsonProcessingException e) { 
      System.out.println("JsonProcessingException: "); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      System.out.println("IOException: "); 
      e.printStackTrace(); 
     } 
    } 
} 

실행이 클래스는 생성합니다

Congratulations! id 493 = userId 493 
+0

Daniel에게 도움을 주셔서 감사합니다. 나는 그대로 그랬다.하지만'readTree' 메소드에서'ObjectMapper 유형의 메소드 readTree (JsonParser)가 인수 (String)'에 적용 할 수 없다는 오류가 나타납니다. 잘못된 jar 파일을 가져올 수 있습니다. 그 이유는 무엇입니까? 그럴 경우 바로 jar 파일을 가리켜 주시겠습니까? 나는 [여기] (http://www.java2s.com/Code/Jar/j/Downloadjacksonjar.htm)에서 항아리를 다운로드했다. – AKIWEB

+0

@ Nevzz03 - 버전 1.9를 사용 중이며 Maven을 사용하여 종속성을 처리하고 있습니다. Maven을 사용하는 경우이 저장소를 가리킬 수 있습니다 (http://repository.codehaus.org/org/codehaus/jackson). 그렇지 않으면 http://wiki.fasterxml.com/JacksonDownload#Latest_stable_1.x_version에서 모든 jar 파일을 가져올 수 있습니다. 내 프로젝트는 classpath에 다음과 같은 4 개의 jar 파일이 있습니다. jackson-core-asl-1.9.2.jar; jackson-mapper-asl-1.9.2.jar; jackson-jaxrs-1.9.2.jar; jackson-xc-1.9.2.jar –

0

아마도 큰 따옴표가 누락되었을 수 있습니다.

"userId:"493 

는 패턴이 시도 :

"userId\":(\\d+)" 

는 마찬가지로 당신이 matcher.group() 안에 \ "를 필요로 등호 (..) 코멘트에 언급 핫 입술처럼

+0

여전히 똑같은. 이 정적 정수 패턴을 사용하여 보았습니다. USER_ID_PATTERN = Pattern.compile ("userId : \"(\\ d +) "); while 루프 안에 들어 가지 않습니다. – AKIWEB

+0

오, 이런, 큰 따옴표가 "userId \": (\\ d +) " – javadba

+0

이 패턴은 올바른 것으로 확인되었습니다. 대신 json 파서를 사용하려는 경우 귀하의 전화입니다. – javadba

관련 문제