使用正则表达式将String与JSON字符串匹配

时间:2013-03-03 01:09:43

标签: java regex json pattern-matching

在我的下面的代码中,colData存储JSON String。 colData的示例示例 -

  

{" LV":[{" V" {" tenureSiteReg":空," bghtItms":48,&#34 ; pnlValue":105.478409," byrSgmnt":2" cstmrId":" 814296998"" slrRevRnk": - 99.0,& #34; soldItms":0," slrSgmnt":6," byrRevRnk":0.013," mainAcct":78," GMV&#34 ;:0.0" cstmrRevRnk":0.021," pnlRev":313.438843," cstmrSgmnt":51," GMB":4674.76&# 34; totalVal":142.536293,"用户id":493}" CN" 42}]," LMD":20130}

现在,我尝试将id值与上述userId中的JSON String值进行匹配。 如果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。有什么我想念的吗?

2 个答案:

答案 0 :(得分:2)

与评论中提到的Hot Lips一样,你应该真正使用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

答案 1 :(得分:0)

也许你只是错过了双引号?

"userId:"493

试试这个模式:

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

同样,你需要在matcher.group()里面的\“。equals(..)