我知道我有一種使用分隔符進行拆分的方法,但我擁有的字串類似于 JSON。
這是字串
[{type=Callback, output=[{name=prompt, value=InputCode}], input=[{name=IDT1, value=}]}, {type=TextOutputCallback, output=[{name=message, value={"current_type":"Code","info":{"some_key":"cf2fc86a","some_type":"Code","ph_no":"111111111"},"attempt":2}}]}]
現在我想以一種可以提取“嘗試”的方式轉換它。所以,我想做這樣的事情
String attempt = map.get("attempt");
問題是這不是有效的 JSON,因為大多數值都不是雙引號。提取它的最佳方法是什么?
uj5u.com熱心網友回復:
來自給定輸入的映射使用正則運算式來匹配和決議一些值。
假設有效鍵被寫為字母數字識別符號,雙引號內帶有可選的下劃線,并且值可以放在雙引號內或作為整數,可以實作以下模式并用于構建映射:
Pattern keyValue = Pattern.compile("(\"\\w \")\\s*:\\s*(\"[^\"] \"|\\d (.\\d )?)");
Map<String, String> map = keyValue.matcher(raw)
.results()
.collect(Collectors.toMap(
kv -> kv.group(1).replace("\"", ""), // strip off double quotes
kv -> kv.group(2).replace("\"", ""), // strip off double quotes
(v1, v2) -> v1 // or join if needed String.join(";", v1, v2)
));
map.forEach((k, v) -> System.out.println(k " -> " v));
System.out.println("\n====\nattempt=" map.get("attempt"));
輸出:
ph_no -> 111111111
some_key -> cf2fc86a
some_type -> Code
attempt -> 2
current_type -> Code
====
attempt=2
uj5u.com熱心網友回復:
假設String結構沒有改變并且attempt是最后一個欄位,您可以使用String而不將其轉換為某些 POJO 或Map:
public static String getAttempt(String json) {
return json.split("\"attempt\":")[1].replaceAll("[^-?0-9] ", "");
}
然后你可以這樣做:
SString json = "[{type=Callback, output=[{name=prompt, value=InputCode}], input=[{name=IDT1, value=}]}, {type=TextOutputCallback, output=[{name=message, value={\"current_type\":\"Code\",\"info\":{\"some_key\":\"cf2fc86a\",\"some_type\":\"Code\",\"ph_no\":\"111111111\"},\"attempt\":2}}]}]";
String attempt = getAttempt(json);
System.out.pritnln(attempt);
輸出:
2
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/326656.html
上一篇:從另一個檔案的不同函式中訪問變數
