1

我有一个 Java 应用程序正在访问一个返回以下 JSON 的第 3 方 RESTful Web 服务:

{"fizz":
    {"widgets":
        [
            {
                "widget_id":"295874"
            },
            {
                "widget_id":"295873"
            },
            {
                "widget_id":"295872"
            }
        ],
        "otime":1361993756
    },
    "resp":"ok"
}

通常我会使用 GSON 或 Genson 将其映射回 Java POJO,但这是我必须执行此操作的唯一代码区域,我想在这里偷懒;-)。

我试图想出一个漂亮的方法来提取 3 个widget_id值(,`) and returns them as aList`:

public List<Long> extractIdsFromJson(String json) {
    // Can I solve this with a regex perhaps?
}

不确定正确的方法是什么 - 正则表达式、replaceAll 或其他方法?提前致谢。

4

3 回答 3

7

从长远来看,在这里偷懒只会咬你一口。解析 JSON 并以这种方式提取值;所涉及的“努力”会更少,代码会更容易理解,未来的代码维护者也不会骂你的名字。

于 2013-02-28T13:03:11.160 回答
4
// untested
public List<Long> extractIdsFromJson(String json) {
    List<Long> list = new ArrayList<Long>();
    Matcher matcher = Pattern.compile("\"widget_id\":\"?(\\d+)\"?").matcher(json);
    while (matcher.find())
        list.add(Long.valueOf(matcher.group(1)));
    return list;
}
于 2013-02-28T13:04:54.617 回答
3

如果你喜欢偷懒。这是解决方案。我希望你知道任何需要你选择用正则表达式解决问题的方法:

  • 它不检查 JSON 的结构。您忽略了 JSON 可能格式错误的事实,只是盲目地提取数据。
  • 它在这里有效,因为您想要一个值不是Objector的属性Array

原始正则表达式:

"widget_id"\s*:\s*"(\d+)"

在文字字符串中:

"\"widget_id\"\\s*:\\s*\"(\\d+)\""

将上面的正则表达式与Matcher循环一起使用:

Pattern p = Pattern.compile("\"widget_id\"\\s*:\\s*\"(\\d+)\"");
Matcher m = p.matcher(inputString);

while (m.find()) {
    System.out.println(m.group(1));
} 
于 2013-02-28T13:04:11.090 回答