COBOL模块生成JSON:将表数据转为无字段名单对象
COBOL生成指定格式JSON的解决方法
需求背景
需要将以下COBOL表结构转换为指定格式的JSON对象:
原COBOL表结构
15 benefitStageAmountsMap OCCURS 4 TIMES. 20 BEN-STG-QUL PIC X(02). 20 BEN-STG-AMT PIC S9(06)V9(02).
目标JSON格式
"benefitStageAmountsMap": { "09": "5", "01": "1.2", "02": "3.4", "03": "4.5" }
核心要求:表中每个条目需转换为无字段名的键值对,键为BEN-STG-QUL的值,值为BEN-STG-AMT的格式化字符串。
现有问题
使用COBOL内置的GENERATE语句生成JSON时,出现以下问题:
GENERATE会忽略Filler字段,无法通过占位符调整结构- 定义大长度PIC字段时,数据拆分不符合预期
- 无法单独省略表条目的字段名,推测是
GENERATE对复杂表结构的解析限制导致
可行解决方案
方案1:手动拼接JSON字符串(兼容性最优)
通过STRING语句结合循环,逐个处理表条目并拼接成目标JSON格式,不受编译器扩展特性限制,可控性最强。
示例代码:
WORKING-STORAGE SECTION. 01 WS-JSON-RESULT PIC X(200) VALUE SPACES. 01 WS-AMT-FORMATTED PIC X(10) VALUE SPACES. 01 WS-HAS-PREV-ENTRY PIC X(1) VALUE 'N'. PROCEDURE DIVISION. *> 初始化JSON对象头部 STRING '"benefitStageAmountsMap": {' INTO WS-JSON-RESULT. *> 循环遍历所有表条目 PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 4 *> 格式化金额:去除前导零,保留有效小数位 MOVE BEN-STG-AMT(WS-IDX) TO WS-AMT-FORMATTED INSPECT WS-AMT-FORMATTED REPLACING LEADING '0' BY SPACE INSPECT WS-AMT-FORMATTED REPLACING TRAILING ' ' BY '0' *> 非首个条目添加分隔逗号 IF WS-HAS-PREV-ENTRY = 'Y' STRING ',' DELIMITED SIZE INTO WS-JSON-RESULT END-IF *> 拼接键值对 STRING '"' BEN-STG-QUL(WS-IDX) '": "' WS-AMT-FORMATTED '"' DELIMITED SIZE INTO WS-JSON-RESULT *> 标记已存在前置条目 MOVE 'Y' TO WS-HAS-PREV-ENTRY END-PERFORM. *> 闭合JSON对象 STRING '}' DELIMITED SIZE INTO WS-JSON-RESULT. *> 输出或使用生成的JSON字符串 DISPLAY WS-JSON-RESULT.
方案2:调整数据结构适配GENERATE语句
若需使用GENERATE,可重新定义数据结构,将每个表条目映射为键值对形式,配合编译器的JSON生成扩展语法实现目标格式。注意:仅支持带有JSON生成扩展的COBOL编译器(如IBM Enterprise COBOL)
示例代码:
WORKING-STORAGE SECTION. 01 BENEFIT-STG-JSON-STRUCT. 05 BEN-STG-MAP-CONTAINER. 15 BEN-STG-ENTRY OCCURS 4 TIMES. 20 BEN-STG-KEY PIC X(2). 20 BEN-STG-VAL PIC S9(06)V9(02). *> 重定义关联原表结构 05 benefitStageAmountsMap REDEFINES BEN-STG-MAP-CONTAINER OCCURS 4 TIMES. 15 BEN-STG-QUL PIC X(2). 15 BEN-STG-AMT PIC S9(06)V9(02). PROCEDURE DIVISION. *> 同步原表数据到适配结构 PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 4 MOVE BEN-STG-QUL(WS-IDX) TO BEN-STG-KEY(WS-IDX) MOVE BEN-STG-AMT(WS-IDX) TO BEN-STG-VAL(WS-IDX) END-PERFORM. *> 使用GENERATE生成JSON,指定键值对映射规则 GENERATE JSON FROM BENEFIT-STG-JSON-STRUCT WITH KEY BEN-STG-MAP-CONTAINER AS OBJECT WITH KEY BEN-STG-ENTRY(WS-IDX) AS PROPERTY BEN-STG-KEY(WS-IDX) END-GENERATE.
方案3:临时变量拆分拼接(折中方案)
先将每个表条目转换为单个键值对字符串,再汇总为完整JSON对象,比全手动拼接更易维护,同时兼容所有编译器。
示例代码:
WORKING-STORAGE SECTION. 01 WS-JSON-FINAL PIC X(200) VALUE SPACES. 01 WS-SINGLE-KV-PAIR PIC X(50) VALUE SPACES. 01 WS-AMT-STR PIC X(10) VALUE SPACES. PROCEDURE DIVISION. MOVE '"benefitStageAmountsMap": {' TO WS-JSON-FINAL. PERFORM VARYING WS-IDX FROM 1 TO 4 *> 格式化金额字符串 UNSTRING BEN-STG-AMT(WS-IDX) DELIMITED BY '.' INTO WS-AMT-STR INSPECT WS-AMT-STR REPLACING LEADING '0' BY SPACE INSPECT WS-AMT-STR REPLACING TRAILING ' ' BY '0' *> 拼接单条键值对 STRING '"' BEN-STG-QUL(WS-IDX) '": "' WS-AMT-STR '"' INTO WS-SINGLE-KV-PAIR *> 追加到最终JSON IF WS-IDX > 1 STRING ', ' WS-SINGLE-KV-PAIR INTO WS-JSON-FINAL ELSE STRING WS-SINGLE-KV-PAIR INTO WS-JSON-FINAL END-IF *> 清空临时变量 MOVE SPACES TO WS-SINGLE-KV-PAIR END-PERFORM. STRING '}' INTO WS-JSON-FINAL. DISPLAY WS-JSON-FINAL.
内容的提问来源于stack exchange,提问作者MR Dahl
相关产品推荐
相关产品推荐

