2013-03-03 103 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

相关问题