在IIB/ACE中使用ESQL构建指定JSON结构的技术求助
ESQL构建目标JSON结构的解决方案
核心思路
- 直接操作
OutputRoot.JSON避免多余的根对象Data - 先初始化主JSON对象和
characteristics数组,遍历数据库记录时追加数组元素而非覆盖整个对象 - 从第一条数据库记录提取公共字段(programId、sku等),保证这些值全局一致
完整ESQL代码示例
DECLARE resultSet REFERENCE TO Database.ResultSet; -- 假设你的数据库查询结果集存在这里 DECLARE firstRow BOOLEAN TRUE; DECLARE charArray REFERENCE; -- 初始化主JSON结构 SET OutputRoot.JSON = { "programId": 0, "sku": "", "productTypeId": 0, "brand": "", "year_no": 0, "characteristics": [] }; -- 定位到characteristics数组 SET charArray = OutputRoot.JSON.characteristics; -- 遍历数据库结果集 WHILE LASTMOVE(resultSet) DO -- 第一条记录时设置公共字段(因为这些值所有记录一致) IF firstRow THEN SET OutputRoot.JSON.programId = resultSet.programId; SET OutputRoot.JSON.sku = resultSet.sku; SET OutputRoot.JSON.productTypeId = resultSet.productTypeId; SET OutputRoot.JSON.brand = resultSet.brand; SET OutputRoot.JSON.year_no = resultSet.year_no; SET firstRow = FALSE; END IF; -- 构建单个characteristic对象并追加到数组 DECLARE charObj ROW; SET charObj.characteristicId = resultSet.characteristicId; SET charObj.value_no = resultSet.value_no; SET charArray[LAST+1] = charObj; -- 移动到下一条记录 MOVE resultSet NEXTSIBLING; END WHILE;
关键点解释
- 解决根对象问题:直接使用
OutputRoot.JSON作为根节点,而非OutputRoot.JSON.Data,生成的JSON就不会包含多余的Data外层对象 - 避免覆盖问题:先初始化
characteristics为空数组,每次遍历记录时用charArray[LAST+1]将新对象追加到数组末尾,而非重新赋值整个数组或主对象 - 保证公共字段一致:通过
firstRow标记只从第一条记录读取programId、sku等公共字段,后续记录不再修改这些值,确保全局一致
内容的提问来源于stack exchange,提问作者hodddibaba
相关产品推荐
相关产品推荐

