我有以下格式的字串
"ABCD XYZ
JSON1: {
'key1':'val',
'key2':{
'key2key1':'key2val1',
'key2key2':'key2val2'}
},
MNO
PQRS
JSON2{...}"
我需要從這樣的字串中提取每個 JSON。在開始 JSON 之前我不知道文本。如何提取它們
uj5u.com熱心網友回復:
這是一個簡單的例子,我們的想法是找到{角色。
從那里我們知道我們正在處理一個 JSON 字串并開始存盤下一個字符。
然后每次我們找到 a 時,}我們都會減少一個計數器,并在找到 a 時增加它{。
當計數器變為 0 時,我們知道此 JSON 已結束,我們將其存盤并移至下一個 JSON 字串。
import java.util.ArrayList;
import java.util.List;
public class FindJson {
public static void main(final String[] args) {
String src = "ABCD XYZ JSON1: { 'key1':'val', 'key2':{ 'key2key1':'key2val1', 'key2key2':'key2val2'} }"
", MNO PQRS JSON2{...}";
StringBuilder jsonBuilder = new StringBuilder();
List<String> jsonStrings = new ArrayList<>();
int openingCurlyBraces = 0;
boolean jsonProcessing = false;
for (int i = 0; i < src.length(); i ) {
char current = src.charAt(i);
switch (current) {
case '{':
openingCurlyBraces ;
jsonProcessing = true;
break;
case '}':
openingCurlyBraces--;
break;
default:
break;
}
if (jsonProcessing) {
jsonBuilder.append(current);
if (openingCurlyBraces == 0) {
jsonStrings.add(jsonBuilder.toString());
jsonBuilder = new StringBuilder();
jsonProcessing = false;
}
}
}
System.out.println(jsonStrings);
}
}
串列的輸出:
[{ 'key1':'val', 'key2':{ 'key2key1':'key2val1', 'key2key2':'key2val2'} }, {...}]
uj5u.com熱心網友回復:
JSON 使用雙引號字串。如果您無法更改此設定,則必須用雙引號替換單引號。
查找 JSON 物件的開頭很容易:您可以使用正則運算式:
Pattern re = Pattern.compile("JSON([0-9] ):");
Matcher matcher = re.matcher(input);
if (matcher.find()) {
// etc...
}
找到 JSON 的結尾不太容易:您不能使用正則運算式,因為它可以包含嵌套結構。這個解決方案定義了一個方法extractJson來查找物件的結尾,并用雙引號替換單引號。生成的字串可以提供給您最喜歡的 JSON 決議器:
Matcher matcher = re.matcher(input);
int index = 0;
while (matcher.find(index)) {
int start = matcher.end();
StringBuilder buf = new StringBuilder();
index = extractJson(input, start, buf);
String json = buf.toString();
// do something with json
}
...
private static int extractJson(String input, int index, StringBuilder buf) {
int bracketLevel = 0;
int st = 0;
while (index < input.length()) {
char c = input.charAt(index );
switch (st) {
case 0:
switch (c) {
case '{':
buf.append(c);
bracketLevel;
break;
case '}':
buf.append(c);
--bracketLevel;
if (bracketLevel <= 0) {
return index;
}
break;
case '\'':
buf.append('"');
st = 1;
break;
default:
buf.append(c);
break;
}
break;
case 1:
switch (c) {
case '\'':
buf.append('"');
st = 0;
break;
case '"':
buf.append('\\');
buf.append(c);
break;
case '\\':
st = 2;
break;
default:
buf.append(c);
}
break;
case 2:
switch (c) {
case '\'':
buf.append(c);
st = 1;
break;
default:
buf.append('\\');
buf.append(c);
st = 1;
break;
}
break;
}
}
return index;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/376146.html
下一篇:JQ根據鍵值洗掉物件
