java - 将逻辑文本解析为Json结构

标签 java json algorithm parsing data-structures

我收到一个 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 程序按逻辑运算符进行拆分。 以下是我一直在尝试的逻辑:

  1. 检查平衡支架。
  2. 如果是,请摘录括号内的内容。
  3. 提取逻辑运算符(AND 或 OR)
  4. 使用上述提取的运算符,将内容拆分为数组/列表。
  5. 对于每个内容,从步骤1开始重复

我无法思考继续前进的逻辑应该是什么

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。

  1. 像这样创建一个 Java 类:

    class Expression {
        String typ;
        String vtp;
        // Other stuff
    }
    

    这应该能够存储您的数据,例如typvtpkey 等。

  2. 解析你的表情。可能在路上 Jim Mischel在他的评论中提出了以上建议。

  3. 解析后,不要将内容存储到数组/列表中(如您在步骤 4 中所述):

    with the above extracted operator, split the contents into an array/list.

但是为每个分割内容创建一个new Expression()。 类似于:new Expression("eq", "str", "z", "15");

  1. 现在您将拥有已解析表达式的 Java 对象结构。您必须将该 Java 对象转换为 JSON。使用 Gson并将其转换为 JSON。

关于java - 将逻辑文本解析为Json结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133715/

相关文章:

Java 平台游戏性能

jquery - 如何在 HTML 单元中获取 Ajax 响应(它呈现网页的 HTML)

algorithm - 最快路径算法

asp.net - 使用从独立 html 页面返回 json 的 asp.net web 服务

arrays - 如何将 Node js中的格式数组从1个字符串更改为另一个对象

algorithm - 解释猫/鸡蛋 throw 问题的 O(n log n) 算法

java - 如何返回 BoundingVolume 中的所有点

Java加运算符

java - 序列化后方法是否占用空间?

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException