【问题标题】:Dynamic JSON key/value pairs generation in ESQLESQL 中的动态 JSON 键/值对生成
【发布时间】:2019-05-10 19:00:43
【问题描述】:

如何将从外部系统检索到的 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"
            }
        }
    }
}

不用说,这可以通过 Split 方法在 Java 中轻松实现 - 我正在 ESQL 中寻找合适的 method

当前 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;

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

【问题讨论】:

  • 您是否被禁止使用 JavaCompute 节点?如果不使用 JavaCompute 节点。
  • @TJA - 这在问题“不用说这可以通过 Split 方法在 Java 中轻松实现 - 我正在 ESQL 中寻找合适的方法”问题中明确提及
  • Muhammad 我询问 Java 的原因是要尝试了解针对 Java 的处方有多强。我工作过的一些地方绝对是“永远不会”,在其他地方,您可以请求架构例外。在一些极端和特殊的情况下,我看到性能从使用 ESQL 的 500 秒提高到使用 Java 的 2 秒多一点,尽管在你的情况下它不太可能那么糟糕。
  • @TJA 我不知道为什么您最初的主题 cmets 被删除了,确切地说。显然,它们被某人标记为“不再需要”,版主选择删除它们。我已经恢复了主题 cmets,但删除了您留下的抱怨您的答案如何被否决的那些。请不要让 cmets 抱怨投反对票;那些对任何人都没有帮助,而反对者永远不会看到他们。一般来说,关于 cmets,它们会被版主定期删除。它们就像要求澄清或建议改进的临时便利贴。
  • @CodyGray 谢谢。有趣的是 cmets 是暂时的,我以前从未见过它们消失。

标签: java json ibm-integration-bus extended-sql


【解决方案1】:

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

ESQL for splitting a string into mulitple values

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

【讨论】:

  • 感谢@Adam - 考虑到 ESQL 中没有原生字符串标记器方法,这似乎是一种合适的自定义方法
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 2016-04-30
  • 2020-06-08
  • 2014-10-18
  • 2013-06-08
  • 1970-01-01
  • 2018-05-20
  • 2021-03-15
相关资源
最近更新 更多