如何使用Progress 4GL从嵌套JSON中获取JournalNum字段值
解决嵌套JSON中获取指定字段的问题
问题场景
需要从以下嵌套JSON中获取JournalNum字段的值(注:示例JSON中实际为Company字段,代码可按需替换字段名):
{"parameters":{"ds":{"GLJrnHed":[{"Company":"EPIC06"}]}}}
原代码仅能处理非嵌套JSON结构,无法适配多层级场景,且不想通过read-json将全量数据转入临时表以节省开销。
解决方案
通过逐层调用JsonObject和JsonArray的API定位目标字段,无需全量解析:
DEFINE VARIABLE TJsonObject AS JsonObject NO-UNDO. DEFINE VARIABLE TParamsObj AS JsonObject NO-UNDO. DEFINE VARIABLE TDsObj AS JsonObject NO-UNDO. DEFINE VARIABLE TGlJrnArray AS JsonArray NO-UNDO. DEFINE VARIABLE TGlJrnObj AS JsonObject NO-UNDO. DEFINE VARIABLE OP-JOURNAL-NUM AS INTEGER NO-UNDO. // 转换根JSON对象 TJsonObject = CAST(oResponse:Entity, JsonObject). // 逐层拆解嵌套结构 IF TJsonObject:Contains("parameters") THEN DO: TParamsObj = TJsonObject:GetJsonObject("parameters"). IF TParamsObj:Contains("ds") THEN DO: TDsObj = TParamsObj:GetJsonObject("ds"). IF TDsObj:Contains("GLJrnHed") THEN DO: TGlJrnArray = TDsObj:GetJsonArray("GLJrnHed"). // 读取数组第一个元素(索引从0开始) IF TGlJrnArray:Length > 0 THEN DO: TGlJrnObj = CAST(TGlJrnArray:Get(0), JsonObject). // 获取目标字段值 IF TGlJrnObj:Contains("JournalNum") THEN DO: OP-JOURNAL-NUM = INTEGER(TGlJrnObj:GetJsonText("JournalNum")). END. END. END. END. END.
说明
- 每一步都加入
Contains判断,避免因字段缺失引发运行时错误 - 通过
GetJsonObject和GetJsonArray逐层访问嵌套节点 - 数组操作先判断长度,再读取指定位置元素;若需遍历所有数组元素,可添加循环逻辑处理
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

