ABAP 到 JSON
【摘要】 创建用于将 ABAP 转换为 JSON 的自定义类 “ZCL_JSON_UTILITY”。该类将包含以下方法:将 ABAP 结构转换为 JSON 格式将 ABAP ITAB 转换为 JSON 格式创建用于转换 JSON 属性情况的自定义转换使用 "ZCL_JSON_UTILITY "类创建自定义程序,以显示 ABAP 到 JSON 的转换。 SE24 创建类 ZCL_JSON_UTILITY...
创建用于将 ABAP 转换为 JSON 的自定义类 “ZCL_JSON_UTILITY”。该类将包含以下方法:
- 将 ABAP 结构转换为 JSON 格式
- 将 ABAP ITAB 转换为 JSON 格式
- 创建用于转换 JSON 属性情况的自定义转换
- 使用 "ZCL_JSON_UTILITY "类创建自定义程序,以显示 ABAP 到 JSON 的转换。
SE24 创建类 ZCL_JSON_UTILITY
定义以下常量是为了使 JSON 属性能以正确的大小写格式化(因为我们在"/UI2/CL_JSON "类的 "SERIALIZE "方法中使用了 "PRETTY_NAME "参数)。
我们将实现 3 种方法。我们将对每个方法进行详细讨论。
convert_stuct_too_json
convert_itab_too_json
convert_name_case
CONVERT_STUCT_TO_JSON
在本方法中,我们将把结构转换为 JSON 数据。因此,我们将在本方法中执行以下操作
调用标准转换 "ID "将结构转换为 JSON 格式。数据将是 XSTRING 格式。如果我们将其转换为字符串,就可以看到 JSON 数据。但是,属性将使用 “大写”。
将转换后的 JSON 数据传递给自定义转换 “ZJSON_XML_TO_DIFF_CASE”,将其转换为所需的大小写。我们将很快讨论这种转换。
一旦数据按照上一点进行了转换,我们将收到转换后的 xstring 格式 JSON。要将其转换为字符串格式,需要使用 "CL_ABAP_CODEPAGE "类中的 "CONVERT_FROM "方法。就是这样。转换完成。就这么简单。
DATA:
lo_string_writer TYPE REF TO cl_sxml_string_writer.
DATA:
lv_data TYPE xstring,
lv_arr_textin TYPE string,
lv_arr_textot TYPE string,
lv_len TYPE i.
TRY.
"Create string writer for JSON
lo_string_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
"Call transformation
CALL TRANSFORMATION id SOURCE structure = im_s_data RESULT XML lo_string_writer.
lv_data = lo_string_writer->get_output( ).
FREE lo_string_writer.
"Create string writer for JSON
lo_string_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
"Call transformation
CALL TRANSFORMATION zjson_xml_to_diff_case
PARAMETERS mode = im_v_case
SOURCE XML lv_data
RESULT XML lo_string_writer.
"Get JSON in string format
rt_v_json = cl_abap_codepage=>convert_from( lo_string_writer->get_output( ) ).
lv_arr_textin = 'structure'.
zcl_json_utility=>convert_fname_case(
EXPORTING
im_v_fname = lv_arr_textin
im_v_case = |{ im_v_case }|
RECEIVING
rt_v_fname = lv_arr_textot
).
IF rt_v_json CS lv_arr_textot.
lv_arr_textot = `{"` && lv_arr_textot && '":'.
REPLACE FIRST OCCURRENCE OF lv_arr_textot IN rt_v_json WITH ''.
lv_len = strlen( rt_v_json ) - 1.
IF lv_len GT 0.
rt_v_json = rt_v_json+0(lv_len).
ENDIF.
ENDIF.
CATCH cx_root.
RAISE EXCEPTION TYPE zcx_json_conversion_error.
ENDTRY.
CONVERT_ITAB_TO_JSON
DATA:
lo_string_writer TYPE REF TO cl_sxml_string_writer.
DATA:
lv_data TYPE xstring,
lv_arr_textin TYPE string,
lv_arr_textot TYPE string,
lv_len TYPE i.
TRY.
"Create string writer for JSON
lo_string_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
"Call transformation
CALL TRANSFORMATION id SOURCE array = im_t_table RESULT XML lo_string_writer.
lv_data = lo_string_writer->get_output( ).
FREE lo_string_writer.
"Create string writer for JSON
lo_string_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
"Call transformation
CALL TRANSFORMATION zjson_xml_to_diff_case
PARAMETERS mode = im_v_case
SOURCE XML lv_data
RESULT XML lo_string_writer.
"Get JSON
rt_v_json = cl_abap_codepage=>convert_from( lo_string_writer->get_output( ) ).
lv_arr_textin = 'Array'.
zcl_json_utility=>convert_fname_case(
EXPORTING
im_v_fname = lv_arr_textin
im_v_case = |{ im_v_case }|
RECEIVING
rt_v_fname = lv_arr_textot
).
IF rt_v_json CS lv_arr_textot.
lv_arr_textot = `{"` && lv_arr_textot && '":'.
REPLACE FIRST OCCURRENCE OF lv_arr_textot IN rt_v_json WITH ''.
lv_len = strlen( rt_v_json ) - 1.
IF lv_len GT 0.
rt_v_json = rt_v_json+0(lv_len).
ENDIF.
ENDIF.
CATCH cx_root.
RAISE EXCEPTION TYPE zcx_json_conversion_error.
ENDTRY.
CONVERT_FNAME_CASE
DATA:
lv_str TYPE string.
CLEAR rt_v_fname.
CHECK im_v_fname IS NOT INITIAL.
CASE im_v_case.
WHEN co_ftype_lowercase.
rt_v_fname = to_lower( im_v_fname ).
WHEN co_ftype_uppercase.
rt_v_fname = to_upper( im_v_fname ).
WHEN co_ftype_camelcase_upper.
lv_str = to_mixed( im_v_fname ).
rt_v_fname = to_upper( im_v_fname(1) ) && lv_str+1.
WHEN co_ftype_camelcase.
lv_str = to_mixed( im_v_fname ).
rt_v_fname = to_lower( im_v_fname(1) ) && lv_str+1.
ENDCASE.
REPLACE all OCCURRENCES OF '"' in rt_v_fname WITH ''.
参考链接:
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)