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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:15:33