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

Java正则表达式和/或字符串魔术从字符串中提取ID,java,regex,json,string,Java,Regex,Json,String,我有一个Java应用程序正在访问一个返回以下JSON的第三方RESTful web服务: {"fizz": {"widgets": [ { "widget_id":"295874" }, { "widget_id":"295873" }, { "widget_

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

{"fizz":
    {"widgets":
        [
            {
                "widget_id":"295874"
            },
            {
                "widget_id":"295873"
            },
            {
                "widget_id":"295872"
            }
        ],
        "otime":1361993756
    },
    "resp":"ok"
}
通常我会使用GSON或Genson将其映射回javapojo,但这是代码中唯一需要这样做的区域,我希望在这里懒惰;-)

我试图想出一个漂亮的方法,提取3个
小部件id
值(
`),并将它们作为一个
列表返回:

public List<Long> extractIdsFromJson(String json) {
    // Can I solve this with a regex perhaps?
}
public List extractIdsFromJson(字符串json){
//我可以用正则表达式解决这个问题吗?
}

不确定什么是正确的方法-regex、replaceAll或其他方法?提前谢谢。

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

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

如果你喜欢懒惰的话。这是解决办法。我希望您知道使用regex解决问题所需的一切:

  • 它不检查JSON的结构。您忽略了JSON格式可能不正确的事实,只是盲目地提取数据
  • 它在这里工作,因为您需要的属性的值不是
    对象
    数组
原始正则表达式:

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

如果你喜欢懒惰。这是解决办法。我希望您知道使用regex解决问题所需的一切:

  • 它不检查JSON的结构。您忽略了JSON格式可能不正确的事实,只是盲目地提取数据
  • 它在这里工作,因为您需要的属性的值不是
    对象
    数组
原始正则表达式:

"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));
} 
//未经测试
公共列表extractIdsFromJson(字符串json){
列表=新的ArrayList();
Matcher Matcher=Pattern.compile(“\”widget\u id\”:\“?(\\d+)\”?”).Matcher(json);
while(matcher.find())
添加(长.valueOf(matcher.group(1));
退货清单;
}
//未经测试
公共列表extractIdsFromJson(字符串json){
列表=新的ArrayList();
Matcher Matcher=Pattern.compile(“\”widget\u id\”:\“?(\\d+)\”?”).Matcher(json);
while(matcher.find())
添加(长.valueOf(matcher.group(1));
退货清单;
}

当你说“解析JSON”时,你的意思是像使用某种
扫描仪
/
StringTokenizer
combo?@DirtyMikeAndTheBoys这意味着使用JSON解析库使用GSON/Jackson/随便什么。这会帮你省去很多痛苦。例如,如果widget_id返回时没有引号,这是完全有效的JSON,那么简单的正则表达式将失败,而解析器可以使用它。@jgm如果在
widget_id
键周围没有引号,这就不是完全有效的JSON。但是,如果该值变为数字,则会产生反作用。@jgm请注意,在这种情况下,解析器将报告不同的数据类型。这有关系吗?当你说“解析JSON”时,你的意思是像使用某种
Scanner
/
StringTokenizer
combo?@DirtyMikeAndTheBoys这意味着,使用JSON解析库使用GSON/Jackson/随便什么。这会帮你省去很多痛苦。例如,如果widget_id返回时没有引号,这是完全有效的JSON,那么简单的正则表达式将失败,而解析器可以使用它。@jgm如果在
widget_id
键周围没有引号,这就不是完全有效的JSON。但是,如果该值变为数字,则会产生反作用。@jgm请注意,在这种情况下,解析器将报告不同的数据类型。这有关系吗?“将它们作为列表返回”,而不是“打印出来”。不过很容易修复。@JanDvorak:打印只是为了演示如何操作。其余的OP可以适应他的需要。“以列表的形式返回”,而不是“打印”。不过很容易修复。@JanDvorak:打印只是为了演示如何操作。其余的人可以适应他的需要。