Java正则表达式和/或字符串魔术从字符串中提取ID
我有一个Java应用程序正在访问一个返回以下JSON的第三方RESTful web服务:Java正则表达式和/或字符串魔术从字符串中提取ID,java,regex,json,string,Java,Regex,Json,String,我有一个Java应用程序正在访问一个返回以下JSON的第三方RESTful web服务: {"fizz": {"widgets": [ { "widget_id":"295874" }, { "widget_id":"295873" }, { "widget_
{"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:打印只是为了演示如何操作。其余的人可以适应他的需要。