2013-03-03 62 views
0

在我的下面的代碼中,colData存儲JSON String。對於colData-使用常規表達式將字符串與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,」 用戶id 「:493},」 CN 「:42}],」 LMD「:20130}

現在我試圖在上面的JSON String中匹配id值與userId值。 含義如果id的值爲493那麼在上面的JSON字符串中userId的值也應該是493。而在JSON字符串中,可能有很多userId values,因此所有的userId值都應與id匹配。如果其中任何一個不匹配,則記錄異常。

所以我試圖像這 -

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

*有什麼我缺少* A JSON解析器,也許? – 2013-03-03 01:12:35

+0

@HotLicks,你能否給我提供一個例子來實現上述場景? – AKIWEB 2013-03-03 01:21:51

+0

將JSON解析爲地圖。在地圖中找到「lv」地圖數組。遍歷數組並找到「v」元素,這是另一張地圖。在該地圖內找到「userId」元素。 – 2013-03-03 02:12:42

回答

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文件嗎?我從[here](http://www.java2s.com/Code/Jar/j/Downloadjacksonjar.htm)下載了這些罐子。 – AKIWEB 2013-03-03 17:52:28

+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;傑克遜映射器-ASL-1.9.2.jar;傑克遜 - JAXRS-1.9.2.jar;傑克遜-XC-1.9.2.jar – 2013-03-04 16:47:28

0

也許你只是想念雙引號?

"userId:"493 

嘗試一下本作的模式:

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

同樣你所需要的\」的matcher.group()內的equals(..)

+0

仍然是同樣的事情。我嘗試過使用這種方法 - 「公共靜態最終模式USER_ID_PATTERN = Pattern.compile(」userId:\「(\\ d +)」);'。它不會在while循環內運行 – AKIWEB 2013-03-03 01:47:48

+0

哦,我的不好,雙引號是錯誤的位置相對於冒號。這裏是正確的模式:再次嘗試。「userId \」:(\\ d +)「 – javadba 2013-03-03 05:53:16

+0

此模式已被驗證爲正確。如果你想使用json解析器,而不是你的調用。 – javadba 2013-03-03 21:01:33

相關問題