#java #regex #jsonata
Вопрос:
Я пытаюсь использовать jsonata4java, используя оператор $match и регулярное выражение в предикате.
Код jsonata был успешно протестирован в приложении JSonata Exerciser, но в моем тесте java произошел сбой с сообщениями об ошибках, которые, по-видимому, поступают от antlr (лексера/синтаксического анализатора). Тренажер использовался с одинаковыми входными данными.
Что было попробовано: 1) Обновление до последней версии jsonata4java (1.0.5). 2) Различные способы экранирования определенных символов (снятых в темноте) 3) упрощение выражения 4) использование стиля лямбда в предикате (tin ~> /регулярное выражение/) вместо соответствия 5) пошаговое выполнение некоторого сгенерированного кода синтаксического анализа
public void test() {
try {
Expressions expr = null;
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonObj = null;
String json = "{"id":"1234"}";
String expression = "$[$match(id, /1234/)].id";
// String expression = "$.id";
System.out.println("Expression: " expression);
jsonObj = mapper.readTree(json);
expr = Expressions.parse(expression);
JsonNode jsonResult = expr.evaluate(jsonObj);
System.out.println("" mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonResult));
}
catch(Throwable th) {
System.out.println(th.getMessage());
}
}
Я ожидал, что этот код просто отобразит атрибут «id», «1234». Вместо этого он создает исключение при выполнении Expressions.parse(выражение). Текст сообщений об ошибках выглядит следующим образом:
Expression: $[$match(id, /1234/)].id
line 1:2 at [@1,2:2='[',<16>,1:2]: missing '.' at '[',
line 1:14 at [@6,14:14='/',<29>,1:14]: no viable alternative at input '$match(id,/',
line 1:14 at [@6,14:14='/',<29>,1:14]: extraneous input '/' expecting {'(',
'true', 'false', STRING, 'null', '[', '{', '
Эй, я давно здесь не публиковался, спасибо за помощь.
Комментарии:
1. Кроме того, в качестве элемента управления я протестировал закомментированное выражение, которое не содержит кода соответствия/регулярного выражения, и упрощенное выражение работало так, как ожидалось.
2. Похоже, регулярное выражение еще не было реализовано в версии Java - github.com/IBM/JSONata4Java#current-limitations
3. Спасибо, Эндрю, я ценю твою помощь.
, '$', NUMBER, 'function', '-', '$each', '$sift', '$reduce', '$filter', '$map', VAR_ID, ID}, line 1:20 at [@9,20:20=')',<4>,1:20]: no viable alternative at input '1234/)'
Эй, я давно здесь не публиковался, спасибо за помощь.
Комментарии:
1. Кроме того, в качестве элемента управления я протестировал закомментированное выражение, которое не содержит кода соответствия/регулярного выражения, и упрощенное выражение работало так, как ожидалось.
2. Похоже, регулярное выражение еще не было реализовано в версии Java — github.com/IBM/JSONata4Java#current-limitations
3. Спасибо, Эндрю, я ценю твою помощь.