如何使用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
相关产品推荐
相关产品推荐

