Как преобразовать ответ JSON, полученный из внешней системы, в значимые данные (пары ключ/значение) в ESQL?
Полученный JSON:
{
"data": [
{
"name": "application.info.header",
"value": "headerValue"
},
{
"name": "entity.statistics.name.fullName",
"value": "fullNameValue"
},
{
"name": "application.info.matter",
"value": "matterValue"
},
{
"name": "entity.statistics.skill",
"value": "skillValue"
}
]
}
куда,
name
~ иерархия JSON (последний атрибут является ключом)
value
~ значение против ключа
Ожидаемый JSON:
{
"data": {
"application": {
"info": {
"header": "headerValue",
"matter": "matterValue"
}
},
"entity": {
"statistics": {
"name": {
"fullName": "fullNameValue"
},
"skill": "skillValue"
}
}
}
}
Излишне говорить, что это может быть легко достигнуто в Java с помощью метода Split
— я ищу подходящий метод в ESQL.
Текущий модуль ESQL:
CREATE COMPUTE MODULE getDetails_prepareResponse
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE data REFERENCE TO InputRoot.JSON.Data.data.Item[1];
SET OutputRoot.JSON.Data = InputRoot.JSON.Data;
SET OutputRoot.JSON.Data.data = NULL;
WHILE LASTMOVE(data) DO
DECLARE keyA CHARACTER SUBSTRING(data.name BEFORE '.');
DECLARE name CHARACTER SUBSTRING(data.name AFTER '.');
DECLARE keyB CHARACTER SUBSTRING(name BEFORE '.');
DECLARE key CHARACTER SUBSTRING(name AFTER '.');
CREATE LASTCHILD OF OutputRoot.JSON.Data.data.{EVAL('keyA')}.{EVAL('keyB')}
NAME key VALUE data.value;
MOVE data NEXTSIBLING;
END WHILE;
RETURN TRUE;
END;
END MODULE;
В настоящее время это обрабатывается с помощью метода SUBSTRING
в ESQL (только для 3 уровней), но теперь уровни JSON являются динамическими (без ограничений на пары ключ/значение) в соответствии с требованиями.
@TJA - это ясно упоминается в вопросе «Излишне говорить, что этого можно легко достичь в Java с помощью метода Split - я ищу подходящий метод в ESQL»
Мухаммад, причина, по которой я спросил о Java, заключалась в том, чтобы попытаться понять, насколько сильны предписания против Java, с которыми вы столкнулись. В некоторых местах, где я работал, это абсолютный Never Ever, в других вам разрешено запрашивать архитектурное исключение. В некоторых экстремальных и особых случаях я видел улучшение производительности с 500 секунд при использовании ESQL до чуть более 2 секунд при использовании Java, хотя в вашем случае это вряд ли будет так уж плохо.
@TJA Я не знаю, почему именно ваши первоначальные комментарии по теме были удалены. Очевидно, они были помечены кем-то как «больше не нужные», и модератор решил их удалить. Я восстановил комментарии по теме, но удалил те, которые вы оставили, жалуясь на то, что ваш ответ был отклонен. Пожалуйста, не оставляйте комментарии с жалобами на минусы; они никому не помогают, и минусующие их никогда не увидят. Что касается комментариев в целом, то они регулярно удаляются модераторами. Они похожи на временные стикеры с просьбами разъяснений или предложениями по улучшению.
@CodyGray спасибо. Интересно, что комментарии носят временный характер, раньше я не видел, чтобы они исчезали.
Вы можете реализовать свою собственную процедуру для разделения строки. Взгляните на этот ответ для примера.
ESQL для разделения строки на несколько значений
Метод разбивает S в Delim на массив в Env (Environment.Split.Array[]) и удаляет Environment.Split перед его повторным заполнением.
Спасибо @Adam - похоже, это подходящий пользовательский метод, учитывая отсутствие собственного метода String Tokenizer в ESQL.
Вам запрещено использовать узлы JavaCompute? Если не использовать JavaCompute Node.