简体   繁体   English

将逻辑文本解析为 Json 结构

[英]Parsing logical text to Json structure

I receive a java string : "(((x=ss)OR(x=0))AND((y=dd)OR(y=rr))AND(z=1S))" .我收到一个 java 字符串: "(((x=ss)OR(x=0))AND((y=dd)OR(y=rr))AND(z=1S))" I need to parse and format it to a json of below structure.我需要将其解析并格式化为以下结构的 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"
        }
      }
    ]
  }
}

Have been trying with the below java program to split by logical operator.一直在尝试使用以下 java 程序按逻辑运算符拆分。 Below is the logic which I have been trying:以下是我一直在尝试的逻辑:

  1. check for the balanced bracket.检查平衡支架。
  2. if yes, extract contents within the bracket.如果是,则提取括号内的内容。
  3. extract the logical operator (AND or OR)提取逻辑运算符(AND 或 OR)
  4. with the above extracted operator, split the contents into an array/list.使用上面提取的运算符,将内容拆分为数组/列表。
  5. for each content, repeat from the step 1对于每个内容,从步骤 1 开始重复

I am unable to think through what should be the logic to go proceed ahead我无法思考继续前进的逻辑应该是什么

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();
    }

}

Unable to think through the split logic and form the expected json structure.无法思考拆分逻辑并形成预期的json结构。

It will be easier if you could parse the string and model those as Java objects first.如果您可以先解析字符串并将其建模为 Java 对象,则会更容易。 Then you can easily transform Java object to JSON using Gson.然后,您可以使用 Gson 轻松地将 Java 对象转换为 JSON。

  1. Create a Java class something like:创建一个类似于以下内容的 Java 类:

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

    This should be able to store your data such as typ , vtp , key and etc.这应该能够存储您的数据,例如typvtpkey等。

  2. Parse your expression.解析你的表达。 Probably in the way Jim Mischel have suggested above in his comment.可能是Jim Mischel在上面的评论中建议的方式。

  3. After parsing, don't store the contents into an array/list (as you have mentioned in your step 4):解析后,不要将内容存储到数组/列表中(如您在步骤 4 中提到的):

    with the above extracted operator, split the contents into an array/list.使用上面提取的运算符,将内容拆分为数组/列表。

but create a new Expression() for each split content.但为每个拆分的内容创建一个new Expression() Something like: new Expression("eq", "str", "z", "15");类似于: new Expression("eq", "str", "z", "15");

  1. Now you will have a Java Object structure of your parsed expressions.现在您将拥有解析表达式的 Java 对象结构。 You have to convert that Java object to a JSON.您必须将该 Java 对象转换为 JSON。 Use Gson and convert it to JSON.使用Gson并将其转换为 JSON。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM