Java ESQL中动态JSON键/值对的生成

Java ESQL中动态JSON键/值对的生成,java,json,ibm-integration-bus,extended-sql,Java,Json,Ibm Integration Bus,Extended Sql,如何将从外部系统检索到的JSON响应转换为ESQL中有意义的数据(键/值对) 检索到的JSON: { "data": [ { "name": "application.info.header", "value": "headerValue" }, { "name": "entity.statistics.name.fullName", "valu

如何将从外部系统检索到的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"
        }
    ]
}
{
    "data": {
        "application": {
            "info": {
                "header": "headerValue",
                "matter": "matterValue"
            }
        },
        "entity": {
            "statistics": {
                "name": {
                    "fullName": "fullNameValue"
                },
                "skill": "skillValue"
            }
        }
    }
}
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;
在哪里,

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

  • value
    ~针对键的值

预期的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"
        }
    ]
}
{
    "data": {
        "application": {
            "info": {
                "header": "headerValue",
                "matter": "matterValue"
            }
        },
        "entity": {
            "statistics": {
                "name": {
                    "fullName": "fullNameValue"
                },
                "skill": "skillValue"
            }
        }
    }
}
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;
不用说,这可以通过
Split
方法在Java中轻松实现——我正在寻找一种适合ESQL的方法

当前ESQL模块:

{
    "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"
        }
    ]
}
{
    "data": {
        "application": {
            "info": {
                "header": "headerValue",
                "matter": "matterValue"
            }
        },
        "entity": {
            "statistics": {
                "name": {
                    "fullName": "fullNameValue"
                },
                "skill": "skillValue"
            }
        }
    }
}
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;

目前,这是通过ESQL中的
SUBSTRING
方法处理的(仅适用于3个级别),但现在JSON级别是动态的(不限制键/值对)。您可以实现自己的过程来拆分字符串。以这个答案为例


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

是否禁止使用JavaCompute节点?如果不使用JavaCompute节点。@TJA-这在问题“不用说,这可以通过拆分方法在Java中轻松实现-我正在ESQL中寻找一个合适的方法”中有明确提到。Muhammad我询问Java的原因是试图了解您面对的针对Java的药方有多强。在我工作过的一些地方,这绝对是前所未有的,在另一些地方,你可以请求一个架构异常。在一些极端和特殊的情况下,我看到性能从使用ESQL的500秒提高到使用Java的2秒多一点,尽管在您的情况下,性能不太可能那么差。@TJA我不知道您最初的主题注释被删除的确切原因。显然,有人将它们标记为“不再需要”,一位主持人选择将它们删除。我已经恢复了主题评论,但删除了你留下的那些抱怨你的答案被否决的评论。请不要留下评论抱怨反对票;这些对任何人都没有帮助,而下层选民永远也看不到它们。一般来说,版主会定期删除评论。它们就像临时便签,要求澄清或提出改进意见。@CodyGray谢谢。有趣的是,评论是暂时的,我以前从未见过它们消失。谢谢@Adam-考虑到ESQL中没有本机字符串标记器方法,它似乎是一个合适的自定义方法