繁体   English   中英

正则表达式从简单的JSON对象提取值

[英]Regex to extract value from a simple JSON Object

我正在寻找基于此键的JSON值,而无需任何JSON库。 我认为可以在正则表达式中完成,只是不知道如何做。 所有值都是整数。

{"key1":11,"key2":2877,"key3":666,"key4":2906}

例如,如果我将key1作为方法的输入,我想返回整数11。

public String valueFromKey(String key, String json) {
    String result = null;
    String patternStr= "Some regex with " + key;

    Pattern pattern = Pattern.compile(patternStr);
    Matcher matcher = pattern.matcher(json);

    while (matcher.find())
        result = matcher.group(1);
    }

    return result;
}

// elsewhere..
String numStr = valueFromKey("key1", "{\"key1\":11,\"key2\":2877,\"key3\":666,\"key4\":2906}");

if (numStr != null)
    int val = Integer.parseInt(numStr);

我只会使用JSON解析器。

话虽如此,您已经说过:

  • 你不想
  • 所有值都是整数

如果再加上另一个主要假设:

  • JSON将以其最小形式而不是格式设置(属性名称和值之间的:周围没有空格)

然后是的,可以使用一个非常简单的正则表达式:

"key1":(\d+)

由于Java没有正则表达式的文字,对于字符串中有,因为我们需要使用在字符串字面特殊字符一些反斜杠(具体地讲, "\\ ):

Pattern p = Pattern.compile("\"key1\":(\\d+)");

这定义了与文字字符串"key1":的匹配"key1":后跟一个或多个数字,并将这些数字定义为捕获组。 这是JavaScript中的示例:

 var json = '{"key1":11,"key2":2877,"key3":666,"key4":2906}'; var match = /"key1":(\\d+)/.exec(json); console.log(match ? "Got " + match[1] : "No match"); 

不建议这样做 ,但是基于这些假设,这是可能的。

最好使用Json Parser,但如果您坚持:

    Pattern pattern = Pattern.compile(
        String.format("\"%s\":\s([0-9]+)", key)
    );

在这里,我假设值只是数字,并且键和值之间可以有空格。

另一种选择是使用splitMap

Map<String, Integer> map = new HashMap<>();
for (String keyValue: json.split(",")) {
    String[] data = keyValue.split(":");
    map.put(
        data[0].replace("\"", """),
        Integer.valueOf(data[1].trim());
    );
}

之后,您只需执行map.get(key)

当您可以使用解析器解析JSON时,我根本不知道为什么要这么做。

String patternStr= key + "\":(\\d+)";

根据您显示给我们的输入字符串,正则表达式将为key + \\":(\\d+)"

不过,请使用JSON PARSER

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM