You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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" } ] }

错误原因

  1. 手动添加了Item层级:代码中直接将字段赋值给OutputRoot.JSON.Data.Item[itemCount],导致输出多出外层Item对象,不符合目标结构。
  2. 循环内重复创建f数组:每次循环执行CREATE FIELD会重复生成f数组,可能引发结构冲突。
  3. 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;

错误原因

  1. 顶层字段无索引:循环中直接赋值给OutputRoot.JSON.Data.a等字段,每次循环都会覆盖之前的值,最终只保留最后一条记录的内容。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 16:10:26