[英]Parsing logical text to Json structure
我收到一個 java 字符串: "(((x=ss)OR(x=0))AND((y=dd)OR(y=rr))AND(z=1S))"
。 我需要將其解析並格式化為以下結構的 json。
{
"exp": {
"typ": "and",
"sbe": [
{
"exp": {
"typ": "or",
"vtp": "sta",
"key": "x",
"vsa": [
"ss",
"0"
]
}
},
{
"exp": {
"typ": "or",
"vtp": "sta",
"key": "y",
"vsa": [
"dd",
"rr"
]
}
},
{
"exp": {
"typ": "eq",
"vtp": "str",
"key": "z",
"vsa": "1S"
}
}
]
}
}
一直在嘗試使用以下 java 程序按邏輯運算符拆分。 以下是我一直在嘗試的邏輯:
我無法思考繼續前進的邏輯應該是什么
public class Tester {
public static void main(String[] args) throws IOException {
String input = "(((x=ss)OR(x=0))AND((y=dd)OR(y=rr))AND(z=1S))";
if (isExpressionBalanced(input)) {
System.out.println("input = " + input);
extractRecursive(input);
} else {
System.out.println("The expression is not balanced");
}
}
private static List<String> splitByOperator(String text) {
Map<String, String > map = new HashMap<>();
String bracketContents = getWhatsInsideBrackets(text);
String operator = extractOperator(bracketContents);
if (operator == null) {
System.out.println(bracketContents);
map.put(bracketContents.split("=")[0], bracketContents.split("=")[1]);
return Collections.emptyList();
}
String[] splitTextArray = bracketContents.split(operator);
for (String splitText : splitTextArray) {
System.out.println(operator);
List<String> list = splitByOperator(splitText);
list.size();
}
return Arrays.asList(splitTextArray);
}
private static void extractRecursive(String text) {
List<String> splitTextArray = splitByOperator(text);
for (String splitText : splitTextArray) {
String bracketContents = getWhatsInsideBrackets(splitText);
List<String> list = splitByOperator(bracketContents);
list.size();
}
}
public static String getWhatsInsideBrackets(String stringWithBracket) {
int firstBracketIndexStart = stringWithBracket.indexOf('(');
int firstBracketIndexEnd = findClosingParen(stringWithBracket.toCharArray(), firstBracketIndexStart);
String stringWIthinBrackets = stringWithBracket.substring(firstBracketIndexStart + 1, firstBracketIndexEnd);
return stringWIthinBrackets;
}
private static String extractOperator(String text) {
String operator = null;
int innerFirstBracketIndexStart = text.indexOf('(');
if (innerFirstBracketIndexStart < 0) {
return operator;
}
int innerFirstBracketIndexEnd = findClosingParen(text.toCharArray(), innerFirstBracketIndexStart);
if (text.startsWith("AND", innerFirstBracketIndexEnd + 1)) {
operator = "AND";
} else if (text.startsWith("OR", innerFirstBracketIndexEnd + 1)) {
operator = "OR";
}
return operator;
}
public static int findClosingParen(char[] text, int openPos) {
int closePos = openPos;
int counter = 1;
while (counter > 0) {
char c = text[++closePos];
if (c == '(') {
counter++;
} else if (c == ')') {
counter--;
}
}
return closePos;
}
static boolean isExpressionBalanced(String searchTerm) {
Stack stack = new Stack();
for (int i = 0; i < searchTerm.length(); i++) {
if (searchTerm.charAt(i) == '(') {
stack.push(searchTerm.charAt(i));
}
if (searchTerm.charAt(i) == ')') {
if (stack.empty()) {
return false;
}
char top_char = (char) stack.pop();
if ((top_char == '(' && searchTerm.charAt(i) != ')')) {
return false;
}
}
}
return stack.empty();
}
}
無法思考拆分邏輯並形成預期的json結構。
如果您可以先解析字符串並將其建模為 Java 對象,則會更容易。 然后,您可以使用 Gson 輕松地將 Java 對象轉換為 JSON。
創建一個類似於以下內容的 Java 類:
class Expression { String typ; String vtp; // Other stuff }
這應該能夠存儲您的數據,例如typ
、 vtp
、 key
等。
解析你的表達。 可能是Jim Mischel在上面的評論中建議的方式。
解析后,不要將內容存儲到數組/列表中(如您在步驟 4 中提到的):
使用上面提取的運算符,將內容拆分為數組/列表。
但為每個拆分的內容創建一個new Expression()
。 類似於: new Expression("eq", "str", "z", "15");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.