如何通过COBOL或DFHJS2LS定义可选字段避免.NET空指针异常
解决DFHJS2LS生成JSON时字段必填问题的方法
一、在COBOL结构中标记可选字段
COBOL里可通过以下方式定义可选字段,让DFHJS2LS自动识别为非必填:
- 使用
OCCURS DEPENDING ON(ODO)子句:若字段为动态出现类型,关联一个计数器字段,当计数器为0时,该字段不会出现在JSON中,工具会将其标记为可选。
示例COBOL代码:01 OUTPUT-RECORD. 05 OPTIONAL-FIELD-COUNT PIC 9(02) COMP-5. 05 OPTIONAL-FIELDS OCCURS 0 TO 10 TIMES DEPENDING ON OPTIONAL-FIELD-COUNT. 10 OPTIONAL-DATA PIC X(20). - 用指示器字段配合条件
REDEFINES:添加布尔型指示器字段标记后续字段是否存在,DFHJS2LS会依据指示器将字段设为可选。
示例COBOL代码:01 OUTPUT-RECORD. 05 HAS-OPTIONAL-FIELD PIC X(01) VALUE 'N'. 88 OPTIONAL-FIELD-PRESENT VALUE 'Y'. 05 OPTIONAL-FIELD PIC X(30) REDEFINES FILLER WHEN OPTIONAL-FIELD-PRESENT.
二、通过DFHJS2LS配置调整字段必填性
运行DFHJS2LS生成转换规则时,可通过参数或配置文件指定字段为可选:
- 命令行使用
--optional-fields参数:指定需设为可选的字段完全限定路径,多字段用逗号分隔。
示例命令:DFHJS2LS -c MYCONFIG.JSON -i MYCOBOL.COB -o MYTRANSFORM.XML --optional-fields "OUTPUT-RECORD.OPTIONAL-FIELD,OUTPUT-RECORD.ANOTHER-OPTIONAL-FIELD" - JSON配置文件中定义
optionalFields数组:在配置文件里添加该数组,列出所有目标字段的完全限定名。
示例配置片段:{ "cobolProgram": "MYPROG", "optionalFields": [ "OUTPUT-RECORD.OPTIONAL-FIELD", "OUTPUT-RECORD.ANOTHER-OPTIONAL-FIELD" ] }
三、额外注意事项
- 确保COBOL结构中的可选字段在业务逻辑中确实可能为空,避免强制赋值,保证生成的JSON与.NET类匹配。
- 生成.NET类后,建议检查属性可空性,将非必填字段标记为可空类型(如
string?而非string),进一步规避空指针异常。
内容的提问来源于stack exchange,提问作者Remy Fale
相关产品推荐
相关产品推荐

