在ESQL中动态生成JSON键/值对

Muh*_*din 5 java json ibm-integration-bus extended-sql

如何在ESQL中将从外部系统检索到的JSON响应转换为有意义的数据(键/值对)?

检索的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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

哪里,

  • name 〜JSON的层次结构(最后一个属性是关键)

  • value 〜对关键的价值

预期的JSON:

{
    "data": {
        "application": {
            "info": {
                "header": "headerValue",
                "matter": "matterValue"
            }
        },
        "entity": {
            "statistics": {
                "name": {
                    "fullName": "fullNameValue"
                },
                "skill": "skillValue"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不用说,这可以通过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;
Run Code Online (Sandbox Code Playgroud)

目前,这是通过SUBSTRINGESQL中的方法处理的(仅适用于3个级别),但现在JSON级别已根据要求是动态的(键/值对没有限制)。

小智 2

您可以实现自己的过程来分割字符串。看看这个答案的例子。

用于将字符串拆分为多个值的 ESQL

该方法将 Delim 上的 S 拆分为 Env 中的数组 (Environment.Split.Array[]),并在重新填充之前删除 Environment.Split。