簡體   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