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

如何使用Progress 4GL读取嵌套JSON文件中的数据值

嵌套JSON动态读取并赋值到临时表的解决方案

你的问题核心是JSON存在嵌套层级(外层有Reprint节点),而默认的READ-JSON更适合处理扁平结构或数组,因此需要先解析外层节点,再读取内层属性到临时表。以下是两种实现方案:

1. 静态临时表(已知JSON结构)

如果已经清楚Reprint节点下的属性结构,可以先定义匹配的临时表,再逐层解析JSON:

// 定义匹配JSON内层结构的临时表
DEFINE TEMP-TABLE ttReprint NO-UNDO
    FIELD RequestID AS CHARACTER
    FIELD DeviceCode AS CHARACTER
    FIELD Copies AS INTEGER.

DEFINE VARIABLE hRootJson AS HANDLE NO-UNDO.
DEFINE VARIABLE hReprintJson AS HANDLE NO-UNDO.

// 读取整个JSON文件到根JsonObject
READ-JSON FILE "你的JSON文件路径" INTO hRootJson.

// 获取嵌套的Reprint节点对象
hReprintJson = hRootJson:GetJsonObject("Reprint").

// 将内层JSON对象的数据写入临时表
CREATE ttReprint.
READ-JSON OBJECT hReprintJson INTO ttReprint.

// 验证读取结果
DISPLAY ttReprint.RequestID ttReprint.DeviceCode ttReprint.Copies.

// 清理句柄,避免内存泄漏
DELETE OBJECT hReprintJson.
DELETE OBJECT hRootJson.

2. 动态临时表(未知JSON结构)

如果需要完全动态适配任意嵌套JSON结构,可以通过遍历JSON属性来动态创建临时表字段并赋值:

DEFINE VARIABLE hRootJson AS HANDLE NO-UNDO.
DEFINE VARIABLE hReprintJson AS HANDLE NO-UNDO.
DEFINE VARIABLE hTempTable AS HANDLE NO-UNDO.
DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO.
DEFINE VARIABLE cPropName AS CHARACTER NO-UNDO.
DEFINE VARIABLE hPropEnum AS HANDLE NO-UNDO.

// 创建动态临时表
CREATE TEMP-TABLE hTempTable.
hTempTable:TEMP-TABLE-PREPARE("ttDynamicReprint").
hBuffer = hTempTable:DEFAULT-BUFFER-HANDLE.

// 读取JSON文件并获取内层Reprint节点
READ-JSON FILE "你的JSON文件路径" INTO hRootJson.
hReprintJson = hRootJson:GetJsonObject("Reprint").

// 遍历Reprint节点的所有属性,动态创建字段并赋值
hPropEnum = hReprintJson:GetPropertyEnumerator().
DO WHILE hPropEnum:MoveNext():
    cPropName = hPropEnum:CurrentKey.
    // 示例默认用CHARACTER类型,可根据实际JSON值类型调整(如INTEGER、DATE等)
    hBuffer:ADD-FIELD(cPropName, "CHARACTER", "", "", ?).
    hBuffer:BUFFER-CREATE().
    hBuffer:BUFFER-FIELD(cPropName):VALUE = hReprintJson:GetString(cPropName).
END.

// 显示读取结果
hTempTable:DISPLAY().

// 清理所有句柄
DELETE OBJECT hPropEnum.
DELETE OBJECT hReprintJson.
DELETE OBJECT hRootJson.
DELETE OBJECT hBuffer.
DELETE OBJECT hTempTable.

关键注意事项

  • 必须先获取嵌套层级的JsonObject,再对其使用READ-JSON,否则会因层级不匹配导致读取失败
  • 动态方案中可以通过hReprintJson:GetType(cPropName)判断属性类型,创建对应类型的临时表字段,提升数据准确性
  • 所有创建的句柄必须手动删除,避免内存泄漏

内容的提问来源于stack exchange,提问作者Manny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:12:35