ESQL编写指定JSON结构输出问题:循环值覆盖及根元素异常
ESQL生成指定JSON结构问题解决
目标JSON结构
需生成的目标JSON格式:
{ "a":1, "b": "string", "c":2, "d": "string", "e": 3, "f":[ { "g":4, "h": "string" } ] }
问题1:输出多余Item根元素
错误代码
SET resultSet.rec[] = PASSTHRU(sqlQuery); DECLARE itemCount INTEGER 1; FOR dataref AS resultSet.rec[] DO DECLARE inRef REFERENCE TO resultSet.rec[itemCount]; SET OutputRoot.JSON.Data.Item[itemCount].a= inRef.a; SET OutputRoot.JSON.Data.Item[itemCount].b= inRef.b; SET OutputRoot.JSON.Data.Item[itemCount].c= inRef.c; SET OutputRoot.JSON.Data.Item[itemCount].d= inRef.d; SET OutputRoot.JSON.Data.Item[itemCount].e= inRef.e; --year 5 CREATE FIELD OutputRoot.JSON.Data.f IDENTITY(JSON.Array)f; SET OutputRoot.JSON.Data.f.Item[itemCount].g= inRef.g; SET OutputRoot.JSON.Data.f.Item[itemCount].h= inRef.h; SET itemCount = itemCount+1; END FOR;
错误输出
{ "Item": { "a":1, "b": "string", "c":2, "d": "string", "e": 3 }, "f":[ { "g":4, "h": "string" } ] }
错误原因
- 手动添加了
Item层级:代码中直接将字段赋值给OutputRoot.JSON.Data.Item[itemCount],导致输出多出外层Item对象,不符合目标结构。 - 循环内重复创建
f数组:每次循环执行CREATE FIELD会重复生成f数组,可能引发结构冲突。 f数组嵌套错误:用OutputRoot.JSON.Data.f.Item[itemCount]赋值,导致数组元素被额外的Item包裹,违反目标结构要求。
问题2:多轮循环值覆盖
错误代码
SET resultSet.rec[] = PASSTHRU(sqlQuery); DECLARE itemCount INTEGER 1; FOR dataref AS resultSet.rec[] DO DECLARE inRef REFERENCE TO resultSet.rec[itemCount]; SET OutputRoot.JSON.Data.a= inRef.a; SET OutputRoot.JSON.Data.b= inRef.b; SET OutputRoot.JSON.Data.c= inRef.c; SET OutputRoot.JSON.Data.d= inRef.d; SET OutputRoot.JSON.Data.e= inRef.e; --year 5 CREATE FIELD OutputRoot.JSON.Data.f IDENTITY(JSON.Array)f; SET OutputRoot.JSON.Data.f.Item.g= inRef.g; SET OutputRoot.JSON.Data.f.Item.h= inRef.h; SET itemCount = itemCount+1; END FOR;
错误原因
- 顶层字段无索引:循环中直接赋值给
OutputRoot.JSON.Data.a等字段,每次循环都会覆盖之前的值,最终只保留最后一条记录的内容。 f数组无索引赋值:使用OutputRoot.JSON.Data.f.Item.g时未指定数组索引,每次循环都会覆盖f数组内的同一个元素,无法生成多元素数组。
正确ESQL代码
场景1:单条记录生成单个目标JSON,或多条记录合并为一个JSON(f数组包含所有记录的g/h)
SET resultSet.rec[] = PASSTHRU(sqlQuery); -- 初始化顶层JSON对象和f数组 CREATE FIELD OutputRoot.JSON.Data IDENTITY(JSON.Object); CREATE FIELD OutputRoot.JSON.Data.f IDENTITY(JSON.Array); -- 处理数据库返回的记录 IF CARDINALITY(resultSet.rec[]) > 0 THEN -- 取第一条记录填充顶层a-e字段 DECLARE firstRec REFERENCE TO resultSet.rec[1]; SET OutputRoot.JSON.Data.a = firstRec.a; SET OutputRoot.JSON.Data.b = firstRec.b; SET OutputRoot.JSON.Data.c = firstRec.c; SET OutputRoot.JSON.Data.d = firstRec.d; SET OutputRoot.JSON.Data.e = firstRec.e; -- 遍历所有记录填充f数组 DECLARE arrIdx INTEGER 1; FOR eachRec AS resultSet.rec[] DO DECLARE ref REFERENCE TO eachRec; -- 直接给f数组的对应索引赋值对象,无需额外Item层级 SET OutputRoot.JSON.Data.f[arrIdx].g = ref.g; SET OutputRoot.JSON.Data.f[arrIdx].h = ref.h; SET arrIdx = arrIdx + 1; END FOR; END IF;
场景2:每条记录生成独立的目标JSON(输出JSON数组)
SET resultSet.rec[] = PASSTHRU(sqlQuery); -- 初始化顶层JSON数组 CREATE FIELD OutputRoot.JSON.Data IDENTITY(JSON.Array); DECLARE rootIdx INTEGER 1; FOR eachRec AS resultSet.rec[] DO DECLARE ref REFERENCE TO eachRec; -- 给每个数组元素创建完整的目标结构 SET OutputRoot.JSON.Data[rootIdx].a = ref.a; SET OutputRoot.JSON.Data[rootIdx].b = ref.b; SET OutputRoot.JSON.Data[rootIdx].c = ref.c; SET OutputRoot.JSON.Data[rootIdx].d = ref.d; SET OutputRoot.JSON.Data[rootIdx].e = ref.e; -- 创建当前元素的f数组并填充 CREATE FIELD OutputRoot.JSON.Data[rootIdx].f IDENTITY(JSON.Array); SET OutputRoot.JSON.Data[rootIdx].f[1].g = ref.g; SET OutputRoot.JSON.Data[rootIdx].f[1].h = ref.h; SET rootIdx = rootIdx + 1; END FOR;
内容的提问来源于stack exchange,提问作者IIBguy12345
相关产品推荐
相关产品推荐

