¿Cómo transformar respuesta JSON recuperado del sistema externo a datos significativos (pares clave / valor) en ESQL?
Obtenido 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"
}
]
}
dónde,
name
~ Jerarquía de JSON (último atributo es la clave)value
~ Valor con la clave
JSON esperado:
{
"data": {
"application": {
"info": {
"header": "headerValue",
"matter": "matterValue"
}
},
"entity": {
"statistics": {
"name": {
"fullName": "fullNameValue"
},
"skill": "skillValue"
}
}
}
}
Huelga decir que esto se puede conseguir fácilmente en Java a través de Split
método - Estoy en busca de un adecuado método de ESQL.
La corriente del módulo 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;
Este es actualmente maneja a través de SUBSTRING
método en ESQL (para 3 niveles solamente), pero ahora los niveles JSON son dinámicos (sin límite a pares clave / valor) según los requisitos.
Se podría implementar su propio procedimiento para dividir una cadena. Echar un vistazo a esta respuesta para un ejemplo.
ESQL para dividir una cadena en valores Mulitple
El método se divide en S Delim en una matriz en Env (Environment.Split.Array []) y elimina Environment.Split antes de rellenarlo.