【问题标题】:Match the String with JSON String using Regular Expressions使用正则表达式将字符串与 JSON 字符串匹配
【发布时间】:2013-03-03 01:09:43
【问题描述】:

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

{"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}

现在我正在尝试将id 值与上述JSON String 中的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。我有什么遗漏吗?

【问题讨论】:

  • 我有什么遗漏吗? JSON 解析器,也许?
  • @HotLicks,你能不能也给我提供一个例子来实现上述场景?
  • 将 JSON 解析为地图。在地图中找到地图的“lv”数组。遍历数组并找到“v”元素,这是另一个映射。在该地图中找到“userId”元素。
  • id 值从何而来?它是一个单独的字符串还是应该在 JSON 中?
  • 是的,它是一个单独的字符串。

标签: java regex json pattern-matching


【解决方案1】:

就像 cmets 中提到的 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

【讨论】:

  • 感谢丹尼尔的帮助。我照原样做了。但是我在readTree 方法上遇到错误,说The method readTree(JsonParser) in the type ObjectMapper is not applicable for the arguments (String)。可能是我导入了错误的 jar 文件,这就是为什么?如果是这种情况,请您指出正确的 jar 文件。我从here下载了这些罐子。
  • @Nevzz03 - 我使用的是 1.9 版,我使用 Maven 来处理我的依赖项。如果你使用 Maven,你可以指向这个 repo:repository.codehaus.org/org/codehaus/jackson。否则,您应该能够从 wiki.fasterxml.com/JacksonDownload#Latest_stable_1.x_version 获取所有 jar。我的项目在类路径中有以下 4 个 jar:jackson-core-asl-1.9.2.jar;杰克逊-映射器-asl-1.9.2.jar;杰克逊-jaxrs-1.9.2.jar; jackson-xc-1.9.2.jar
【解决方案2】:

也许您只是缺少双引号?

"userId:"493

试试这个模式:

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

同样你需要 matcher.group().equals(..) 中的 \"

【讨论】:

  • 还是一样。我试过用这个-public static final Pattern USER_ID_PATTERN = Pattern.compile("userId:\"(\\d+)");。它不会进入 while 循环
  • 哦,我的错,双引号相对于冒号的位置错误。这是更正的模式:再试一次。 "userId\":(\\d+)"
  • 此模式已被验证为正确。如果您想使用 json 解析器,那是您的选择。
猜你喜欢
  • 2022-01-17
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多