#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 /