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)
目前,这是通过SUBSTRING
ESQL中的方法处理的(仅适用于3个级别),但现在JSON级别已根据要求是动态的(键/值对没有限制)。
小智 2
您可以实现自己的过程来分割字符串。看看这个答案的例子。
该方法将 Delim 上的 S 拆分为 Env 中的数组 (Environment.Split.Array[]),并在重新填充之前删除 Environment.Split。
归档时间: |
|
查看次数: |
626 次 |
最近记录: |