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

时间:2016-06-15 07:01:17

标签: java json regex

我希望在没有任何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);

3 个答案:

答案 0 :(得分:3)

我只想使用JSON解析器。

话虽如此,你说过:

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

如果我们添加另一个主要假设:

  • JSON将采用最小格式,未格式化(属性名称和值之间:周围没有空格)

然后是的,这是可能的,有一个相当简单的正则表达式:

"key1":(\d+)

由于Java没有正则表达式文字,因此字符串中包含一些反斜杠,用于我们需要使用的字符串文字特有的字符(特别是"\): / p>

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

定义文字字符串"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");

不推荐,但有了这些假设,就有可能。

答案 1 :(得分:1)

最好使用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)

答案 2 :(得分:1)

当你可以使用解析器解析JSON时,我根本不知道你为什么要这样做,但就在这里。

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

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

使用JSON PARSER