regex 如何在Java中使用正则表达式从字符串中检索JSON数组值

vd8tlhqk  于 2022-11-18  发布在  Java
关注(0)|答案(1)|浏览(79)

我需要使用正则表达式从JSON数组的字符串中获取值String示例:

[INFO][2022-11-11] Response body : 
{
   "values":[
      "abc123",
      "def456",
      "xyz789"
   ]
}

所以我想得到值:ABC123,默认值456,xyz789
请注意,我使用的是字符串(实际上是日志输出),因此我不确定是否可以使用任何库进行JSON解析
我尝试使用下面的正则表达式,但只得到最后一个数组值xyz789:

"values"\s*:\s*\[(\s*"(\w+)"\s*,?)*]

我的Java解决方案
第一次

hc2pp10m

hc2pp10m1#

Jackson的例子
如果您使用一个解析JSON的库(如Jackson、Gson等),而不是试图重新发明轮子,那么几乎可以毫不费力地完成。
下面是一个如何使用Jackson完成此操作的示例。
假设您有以下POJO:

public class MyPojo {
    private List<String> values;
    
    // getters, setters
}

这就是反序列化传入JSON所需的全部内容:

String jsonStr = // incoming JSON

ObjectMapper mapper = new JsonMapper();
        
MyPojo pojo = mapper.readValue(jsonStr, MyPojo.class);
System.out.println(pojo.getValues());
  • 输出:*
[abc123, def456, xyz789]

更重要的是,如果你使用像Spring或Jakarta这样的平台,请求和响应的转换将自动完成。
如果数据是动态的,引入POJO没有多大意义,那么您可以将其解析为一个Tree,并使用该Tree的Nodes:

String jsonStr = // incoming JSON
        
ObjectMapper mapper = new JsonMapper();
JsonNode node = mapper.readTree(jsonStr).get("values");
List<String> values = mapper.readerFor(new TypeReference<List<String>>() {}).readValue(node);

values.forEach(System.out::println);
  • 输出:*
abc123
def456
xyz789

手动剖析

如果您想不惜一切代价手动执行此操作,下面是一种通过捕获JSON数组并对其进行拆分来提取这些值的方法:

String jsonStr = // incoming JSON
        
Pattern pattern1 = Pattern.compile("\"values\"\\s*:\\s*\\[(.+)]");
Matcher matcher = pattern1.matcher(jsonStr);
        
List<String> values = List.of();
        
if (matcher.find()) {
    values = Arrays.stream(matcher.group(1).split(","))
        .map(s -> s.replaceAll("\"", "").strip())
        .toList();
}
        
values.forEach(System.out::println);
  • 输出:*
abc123
def456
xyz789

相关问题