Java正则表达式和/或字符串魔术从String中提取ID

时间:2013-02-28 13:00:43

标签: java regex json string

我有一个Java应用程序正在点击返回以下JSON的第三方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 a列表'的漂亮方法:

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

不确定正确的方法是什么 - 正则表达式,替换所有,还有其他什么?提前谢谢。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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;
}

答案 2 :(得分:3)

如果你喜欢懒惰。这是解决方案。我希望你知道如何用正则表达式解决问题:

  • 它不检查JSON的结构。您忽略了JSON可能格式错误并且盲目地提取数据这一事实。
  • 它适用于此处,因为您需要的值不是ObjectArray

RAW正则表达式:

"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));
}