Генерация динамических пар ключ/значение JSON в ESQL

Как преобразовать ответ 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 являются динамическими (без ограничений на пары ключ/значение) в соответствии с требованиями.

Вам запрещено использовать узлы JavaCompute? Если не использовать JavaCompute Node.

TJA 20.04.2019 02:56

@TJA - это ясно упоминается в вопросе «Излишне говорить, что этого можно легко достичь в Java с помощью метода Split - я ищу подходящий метод в ESQL»

Muhammad Faizan Uddin 28.04.2019 08:24

Мухаммад, причина, по которой я спросил о Java, заключалась в том, чтобы попытаться понять, насколько сильны предписания против Java, с которыми вы столкнулись. В некоторых местах, где я работал, это абсолютный Never Ever, в других вам разрешено запрашивать архитектурное исключение. В некоторых экстремальных и особых случаях я видел улучшение производительности с 500 секунд при использовании ESQL до чуть более 2 секунд при использовании Java, хотя в вашем случае это вряд ли будет так уж плохо.

TJA 28.04.2019 12:01

@TJA Я не знаю, почему именно ваши первоначальные комментарии по теме были удалены. Очевидно, они были помечены кем-то как «больше не нужные», и модератор решил их удалить. Я восстановил комментарии по теме, но удалил те, которые вы оставили, жалуясь на то, что ваш ответ был отклонен. Пожалуйста, не оставляйте комментарии с жалобами на минусы; они никому не помогают, и минусующие их никогда не увидят. Что касается комментариев в целом, то они регулярно удаляются модераторами. Они похожи на временные стикеры с просьбами разъяснений или предложениями по улучшению.

Cody Gray 09.05.2019 19:59

@CodyGray спасибо. Интересно, что комментарии носят временный характер, раньше я не видел, чтобы они исчезали.

TJA 10.05.2019 02:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
5
1 890
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете реализовать свою собственную процедуру для разделения строки. Взгляните на этот ответ для примера.

ESQL для разделения строки на несколько значений

Метод разбивает S в Delim на массив в Env (Environment.Split.Array[]) и удаляет Environment.Split перед его повторным заполнением.

Спасибо @Adam - похоже, это подходящий пользовательский метод, учитывая отсутствие собственного метода String Tokenizer в ESQL.

Muhammad Faizan Uddin 10.05.2019 11:33

Другие вопросы по теме