Представление условий SQL в формате Json

#java #sql #json

#java #sql #json

Вопрос:

Существует ли какой-либо метод для преобразования условия SQL в Json? Я имею в виду, мне нужно написать что-то вроде этого:

 x > 5 and (y like '%b%' or z > 5) and b = true
  

в формате Json?

Комментарии:

1. Что бы это значило? JSON — это формат для передачи объекта со свойствами. Существует множество способов передачи этой информации в формате JSON, но декодирование ее в выражение будет зависеть от получателя.

2. Найдите анализатор SQL, проанализируйте соответствующий SQL и преобразуйте часть AST с предикатами в массив JSON.

3. попробуйте tsql-анализатор github.com/bruce-dunwiddie/tsql-parser/blob/master/TSQL_Parser /…

Ответ №1:

Для этого вы могли бы использовать jOOQ и Gson. Вот быстрый и грязный пример того, как это могло бы работать:

 new Gson()
    .newBuilder()
    .setPrettyPrinting()
    // Some jOOQ types can be serialised out of the box
    // For others, you might have to register adapters explicitly:
    .registerTypeHierarchyAdapter(
       Field.class, 
       (JsonSerializer<Field<?>>) (s, t, ctx) -> new JsonPrimitive(s.getName()))
    .create()
    .toJson(DSL.using(SQLDialect.DEFAULT)
       .parser()
       .parseCondition("x > 5 and (y like '%b%' or z > 5) and b = true"), 
       System.out
    );
  

Приведенное выше выводит:

 {
  "operator": "AND",
  "conditions": [
    {
      "field1": "X",
      "field2": "5",
      "comparator": "GREATER"
    },
    {
      "operator": "OR",
      "conditions": [
        {
          "field1": "Y",
          "field2": "%b%",
          "comparator": "LIKE"
        },
        {
          "field1": "Z",
          "field2": "5",
          "comparator": "GREATER"
        }
      ]
    },
    {
      "field1": "B",
      "field2": "true",
      "comparator": "EQUALS"
    }
  ]
}
  

Конечно, это не очень совместимо с прямой передачей, потому что оно использует отражение для доступа к внутренним функциям jOOQ. Имена ваших объектов JSON (например, operator , conditions ) могут измениться в любое время, но для вас этого может быть достаточно.

Будущая версия jOOQ может предлагать более стабильный экспорт своего дерева выражений в формате JSON: https://github.com/jOOQ/jOOQ/issues/9628

Отказ от ответственности: я работаю в компании, стоящей за jOOQ.

Комментарии:

1. Спасибо. Выглядит интересно. Но мне интересно о типах значений. Все они преобразуются в строку.

2. @ks099: Это канонический вывод Gson. Не исключено, что вы можете настроить вывод любым удобным для вас способом. Я имею в виду, не похоже, что у вашего вопроса были какие-то очень специфические требования, верно? 🙂

Ответ №2:

Недавно я нашел и использовал JsonLogic. Это также очень хороший подход. https://jsonlogic.com /