ABAP 到 JSON

举报
雨绸缪 发表于 2023/10/30 16:07:05 2023/10/30
【摘要】 创建用于将 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。