ABAP中使用CALL TRANSFORMATION处理空值/初始值的序列化配置
当然可以!CALL TRANSFORMATION完全支持通过配置参数来控制初始字段的序列化行为,刚好能实现你想要的两种效果——把初始值转成null,或者直接忽略初始字段不输出。下面给你详细讲两种方案的具体实现:
方案1:将初始字段序列化为
null 要实现这个效果,只需要在创建JSON Writer的时候,添加if_sxml=>co_opt_initial_as_null这个选项,它会告诉序列化器把所有初始值字段转为JSON的null类型。
修改后的示例代码:
TYPES: BEGIN OF t_my_type, foo TYPE string, bar TYPE string, END OF t_my_type. DATA ls_structure TYPE t_my_type. ls_structure-foo = 'some value'. ASSERT ls_structure-bar IS INITIAL. * 创建Writer时指定初始值转为null的选项 DATA(lo_json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json options = VALUE #( ( if_sxml=>co_opt_initial_as_null ) ) ). CALL TRANSFORMATION id SOURCE result = ls_structure RESULT XML lo_json_writer. DATA(lv_json_xstring) = lo_json_writer->get_output( ). WRITE cl_abap_codepage=>convert_from( source = lv_json_xstring ).
运行这段代码后,输出结果就是你想要的:
{ "RESULT": { "FOO": "some value", "BAR": null } }
方案2:忽略初始字段不序列化
如果想直接跳过所有初始值字段,不把它们写入JSON,就需要使用if_sxml=>co_opt_omit_initial选项,同样在创建Writer时配置即可。
对应的示例代码:
TYPES: BEGIN OF t_my_type, foo TYPE string, bar TYPE string, END OF t_my_type. DATA ls_structure TYPE t_my_type. ls_structure-foo = 'some value'. ASSERT ls_structure-bar IS INITIAL. * 创建Writer时指定忽略初始值的选项 DATA(lo_json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json options = VALUE #( ( if_sxml=>co_opt_omit_initial ) ) ). CALL TRANSFORMATION id SOURCE result = ls_structure RESULT XML lo_json_writer. DATA(lv_json_xstring) = lo_json_writer->get_output( ). WRITE cl_abap_codepage=>convert_from( source = lv_json_xstring ).
这段代码的输出结果会自动去掉初始值的BAR字段:
{ "RESULT": { "FOO": "some value" } }
补充说明
这两个选项都是SAP SXML库提供的标准配置,适用于基于sxml的JSON序列化(CALL TRANSFORMATION id默认使用这个库处理JSON转换)。需要注意的是,这些选项从SAP NetWeaver 7.40 SP05版本开始支持,如果你的系统版本较旧,可能需要考虑升级系统,或者通过自定义XSLT转换来实现类似效果。
内容的提问来源于stack exchange,提问作者koks der drache
相关产品推荐
相关产品推荐

