ABAP 函数入参/出参格式转换JSON/XML 格式

*&---------------------------------------------------------------------*
*& Report YTEST_JSON
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT yjson.

DATA: gt_params   TYPE STANDARD TABLE OF rfc_fint_p,
      gt_paramtab TYPE abap_func_parmbind_tab,
      gt_exceptab TYPE abap_func_excpbind_tab,
      gv_xstring  TYPE xstring.

SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME.
  PARAMETERS p_name TYPE rs38l_fnam OBLIGATORY MATCHCODE OBJECT sfunc_modules.
  SELECTION-SCREEN SKIP 1.
  SELECTION-SCREEN COMMENT 1(36) TEXT-003.
  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS p_json RADIOBUTTON GROUP g1 MODIF ID m1 DEFAULT 'X'
                     USER-COMMAND uc1.
    SELECTION-SCREEN COMMENT 3(36) TEXT-001 FOR FIELD p_json.
    PARAMETERS p_xml RADIOBUTTON GROUP g1 MODIF ID m1 .
    SELECTION-SCREEN COMMENT 43(36) TEXT-002 FOR FIELD p_xml.
  SELECTION-SCREEN END OF LINE.
  SELECTION-SCREEN SKIP 1.
  SELECTION-SCREEN COMMENT 1(36) TEXT-005.
  PARAMETERS p_displ RADIOBUTTON GROUP g2 MODIF ID m2 DEFAULT 'X'
                     USER-COMMAND uc2.
  PARAMETERS p_dload RADIOBUTTON GROUP g2 MODIF ID m2.
  SELECTION-SCREEN SKIP 1.
  PARAMETERS p_save TYPE c AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK blk1.

INITIALIZATION.

  %_p_name_%_app_%-text = '函数名'.
  %_p_displ_%_app_%-text = '仅显示'.
  %_p_dload_%_app_%-text = '下载'.
  %_p_save_%_app_%-text = '保存'.
  %c003003_1000 = '格式选择'.
  %f001006_1000 = 'JSON'.
  %f002008_1000 = 'XML'.
  %c005011_1000 = '选择'.


***********************************************************************
*   START-OF-SELECTION                                                *
***********************************************************************
START-OF-SELECTION.
  CLEAR: gt_params, gt_paramtab, gt_exceptab, gv_xstring.

  PERFORM build_params.
  PERFORM format_output.

  IF gv_xstring IS NOT INITIAL.
    IF p_save EQ 'X'.
      PERFORM clipboard_export.
    ENDIF.
    IF p_displ EQ 'X'.
      IF p_json = 'X'.
        cl_demo_output=>display_json( gv_xstring ).
      ELSEIF p_xml = 'X'.
        cl_demo_output=>display_xml( gv_xstring ).
      ENDIF.
    ELSEIF p_dload EQ 'X'.
      PERFORM download_data.
    ENDIF.
  ENDIF.

*&---------------------------------------------------------------------*
*& Form build_params
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_params .

  TYPE-POOLS: abap.
  DATA lv_defval TYPE rs38l_defo.
  DATA lv_dataname TYPE string.
  DATA lr_waref TYPE REF TO data.

  FIELD-SYMBOLS:
    <wa>   TYPE any,
    <temp> TYPE any,
    <itab> TYPE ANY TABLE.

  DATA lv_len TYPE i.
  DATA lv_excnt TYPE i VALUE 1.

  DATA ls_paramline  TYPE LINE  OF abap_func_parmbind_tab.
  DATA ls_exceptline TYPE LINE  OF abap_func_excpbind_tab.
  DATA ls_params_p   TYPE rfc_fint_p.

  DEFINE remove_enclosing_quotes.
    " Remove enclosing single quotes
    IF &2 GT 1.
      SUBTRACT 1 FROM &2.
      IF &1+&2 EQ ''''.
        &1+&2 = space.
      ENDIF.
      IF &1(1) EQ ''''.
        SHIFT &1 LEFT.
      ENDIF.
      &2 = strlen( &1 ).
    ENDIF.
  END-OF-DEFINITION.


* 获取RFC的参数
  CALL FUNCTION 'RFC_GET_FUNCTION_INTERFACE_P'
    EXPORTING
      funcname      = p_name
      language      = sy-langu
    TABLES
      params_p      = gt_params
    EXCEPTIONS
      fu_not_found  = 1
      nametab_fault = 2
      OTHERS        = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
    STOP.
  ENDIF.


* Build params table
  LOOP AT gt_params INTO ls_params_p.

    UNASSIGN <wa>.
    UNASSIGN <temp>.
    UNASSIGN <itab>.
    CLEAR ls_paramline.

    CASE ls_params_p-paramclass.
* Import/Export/Changing参数
      WHEN 'I' OR 'E' OR 'C'.

        ls_paramline-name = ls_params_p-parameter.

        IF ls_params_p-paramclass = 'E'.
          ls_paramline-kind = abap_func_importing.
        ELSEIF ls_params_p-paramclass = 'I'.
          ls_paramline-kind = abap_func_exporting.
        ELSE.
          ls_paramline-kind = abap_func_changing.
        ENDIF.

        IF ls_params_p-fieldname IS INITIAL.
          lv_dataname = ls_params_p-tabname.
        ELSE.
          CONCATENATE ls_params_p-tabname ls_params_p-fieldname INTO
              lv_dataname SEPARATED BY '-'.
        ENDIF.

* Assign default values
        lv_defval = ls_params_p-default.
        IF lv_dataname IS INITIAL.
          lv_dataname = 'STRING'.
        ENDIF.
        CREATE DATA lr_waref TYPE (lv_dataname).
        ASSIGN lr_waref->* TO <wa>.
        lv_len = strlen( lv_defval ).
        remove_enclosing_quotes lv_defval lv_len.
        IF lv_defval = 'SPACE'.
          <wa> = space.
        ELSEIF lv_len > 3 AND lv_defval+0(3) = 'SY-'.
          ASSIGN (lv_defval) TO <temp>.
          <wa> = <temp>.
          UNASSIGN <temp>.
        ELSE.
          IF lv_defval IS NOT INITIAL.
            <wa> = lv_defval.
          ENDIF.
        ENDIF.
        IF ls_params_p-exid EQ 'h'.
          ASSIGN lr_waref->* TO <itab>.
          INSERT INITIAL LINE INTO TABLE <itab> ASSIGNING <wa>.
          PERFORM extend_deep_structure CHANGING <wa>.
        ENDIF.
        UNASSIGN <wa>.
        ls_paramline-value = lr_waref.
        INSERT ls_paramline INTO TABLE gt_paramtab.
* Tables参数
      WHEN 'T'.
        ls_paramline-name = ls_params_p-parameter.
        ls_paramline-kind = abap_func_tables.
        IF ls_params_p-exid EQ 'h'.
          CREATE DATA lr_waref TYPE (ls_params_p-tabname).
        ELSE.
          CREATE DATA lr_waref TYPE STANDARD TABLE OF (ls_params_p-tabname).
        ENDIF.
        ASSIGN lr_waref->* TO <itab>.
        INSERT INITIAL LINE INTO TABLE <itab> ASSIGNING <wa>.
        PERFORM extend_deep_structure CHANGING <wa>.
        ls_paramline-value = lr_waref.
        INSERT ls_paramline INTO TABLE gt_paramtab.

    ENDCASE.

  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form format_output
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM format_output .

  TYPE-POOLS: abap.

  DATA:
    lt_stab     TYPE abap_trans_srcbind_tab,
    ls_slin     TYPE abap_trans_srcbind,
    lr_oexcp    TYPE REF TO cx_root,
    lv_etext    TYPE string,
    lr_adata    TYPE REF TO data,
    json_writer TYPE REF TO cl_sxml_string_writer.

  FIELD-SYMBOLS <parm> TYPE abap_func_parmbind.

  LOOP AT gt_paramtab ASSIGNING <parm>.
    ls_slin-name  = <parm>-name.
    ls_slin-value = <parm>-value.
    APPEND ls_slin TO lt_stab.
    CLEAR ls_slin.
  ENDLOOP.

  json_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).

  TRY.
      CASE 'X'.
        WHEN p_xml.
          CALL TRANSFORMATION id OPTIONS data_refs = 'embedded'
                                         initial_components = 'include'
                                 SOURCE (lt_stab)
                                 RESULT XML gv_xstring.
        WHEN p_json.
          CALL TRANSFORMATION id OPTIONS data_refs = 'embedded'
                                         initial_components = 'include'
                                 SOURCE (lt_stab)
                                 RESULT XML json_writer.
*          gv_xstring = json_writer->get_output( ).
          DATA(ls_string) = cl_abap_codepage=>convert_from( json_writer->get_output( ) ).
          "*-----------------------Begin 02.06.2021 16:03:39---------------------------------------------*
          REPLACE ALL OCCURRENCES OF |_-| IN ls_string WITH |/|.
*
*
*          REPLACE ALL OCCURRENCES OF '[{' IN ls_string WITH '{"ITEM":[{'.
*          REPLACE ALL OCCURRENCES OF '}]' IN ls_string WITH '}]}'.
          "*--------------------------End 02.06.2021 16:03:39------------------------------------------*
          gv_xstring = cl_abap_codepage=>convert_to( ls_string ).
      ENDCASE.

    CATCH cx_root INTO lr_oexcp.
      lv_etext = lr_oexcp->if_message~get_text( ).
      MESSAGE lv_etext TYPE 'S' DISPLAY LIKE 'E'.
      STOP.
  ENDTRY.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form download_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM download_data .

  DATA: lv_filename    TYPE string,
        lv_dfname      TYPE string,
        lv_path        TYPE string,
        lv_fullpath    TYPE string,
        lv_result      TYPE i,
        lv_exttype     TYPE string,
        lv_file_filter TYPE string.

  DATA(lv_bytecount) = xstrlen( gv_xstring ).
  DATA(lt_rawdata)   = cl_document_bcs=>xstring_to_solix( ip_xstring  = gv_xstring ).

  IF p_json = 'X'.
    lv_exttype = 'json'.
    lv_file_filter = 'JSON文件(*.json)'.
  ELSEIF p_xml = 'X'.
    lv_exttype = 'xml'.
    lv_file_filter = 'XML文件(*.xml)'.
  ENDIF.

  lv_dfname = p_name.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_extension = lv_exttype
      default_file_name = lv_dfname
      initial_directory = 'C:\'
      file_filter       = lv_file_filter
    CHANGING
      filename          = lv_filename
      path              = lv_path
      fullpath          = lv_fullpath
      user_action       = lv_result.

  IF lv_filename = ''.
    EXIT.
  ENDIF.


  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
      bin_filesize            = lv_bytecount
      filename                = lv_filename
      filetype                = 'BIN'
    CHANGING
      data_tab                = lt_rawdata
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      not_supported_by_gui    = 22
      error_no_gui            = 23
      OTHERS                  = 24.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form clipboard_export
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM clipboard_export .

  DATA: lv_rc TYPE i.

  DATA(lt_rawdata)   = cl_document_bcs=>xstring_to_solix( ip_xstring  = gv_xstring ).
  CALL METHOD cl_gui_frontend_services=>clipboard_export
    IMPORTING
      data                 = lt_rawdata
*     data                 = gv_xstring
    CHANGING
      rc                   = lv_rc
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form extend_deep_structure
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- <WA>
*&---------------------------------------------------------------------*
FORM extend_deep_structure CHANGING cv_data.

  FIELD-SYMBOLS:
    <wa>   TYPE any,
    <itab> TYPE ANY TABLE.

  DO.
    ASSIGN COMPONENT sy-index OF STRUCTURE cv_data TO FIELD-SYMBOL(<field>).
    IF sy-subrc NE 0.
      EXIT.
    ENDIF.
    DESCRIBE FIELD <field> TYPE DATA(ls_type).
    IF ls_type EQ 'h'.
      ASSIGN <field> TO <itab>.
      INSERT INITIAL LINE INTO TABLE <itab> ASSIGNING <wa>.
      PERFORM extend_deep_structure CHANGING <wa>.
    ENDIF.
  ENDDO.

ENDFORM.

生成XML文件ABAP程序 REPORT zams_xml_dom_create . TYPE-POOLS: ixml. CLASS cl_ixml DEFINITION LOAD. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: l_ixml TYPE REF TO if_ixml, l_streamfactory TYPE REF TO if_ixml_stream_factory, l_ostream TYPE REF TO if_ixml_ostream, l_renderer TYPE REF TO if_ixml_renderer, l_document TYPE REF TO if_ixml_document. DATA:l_element_ArchiveBatch TYPE REF TO if_ixml_element, l_element_BatchNumber TYPE REF TO if_ixml_element, l_element_TotalFiles TYPE REF TO if_ixml_element, l_element_TotalVolumes TYPE REF TO if_ixml_element, l_element_TotalPieces TYPE REF TO if_ixml_element, l_element_Entries TYPE REF TO if_ixml_element, l_element_Entry TYPE REF TO if_ixml_element, l_element_RecordsCombiningType TYPE REF TO if_ixml_element, l_element_FilePath TYPE REF TO if_ixml_element, l_element_SourceFileName TYPE REF TO if_ixml_element, l_element_ClassificationCode TYPE REF TO if_ixml_element, l_element_ElectronicRecordCode TYPE REF TO if_ixml_element, l_value TYPE string, l_name type string. DATA: l_xml_table TYPE TABLE OF xml_line, l_xml_size TYPE i, l_rc TYPE i. START-OF-SELECTION. *Creating a ixml factory l_ixml = cl_ixml=>create( ). *Creating the dom object model l_document = l_ixml->create_document( ). *Fill root node with value ArchiveBatch l_element_ArchiveBatch = l_document->create_simple_element( name = 'ArchiveBatch' parent = l_document ). * clear l_value. * l_value = '"http://www.w3.org/2001/XMLSchema-instance"'. * l_rc = l_element_ArchiveBatch->set_attribute( name = 'xmlns: *xsi' * value = l_value ). * * clear l_value. * concatenate '"D:\dev\vs\projects\AMS\DotNet\Sinopec.Ams.' * 'Integration\bin\Debug\config\AmsIntegration.xsd"' * into l_value. * l_name = 'xsi:noNamespaceSchemaLocation'. * l_rc = l_element_ArchiveBatch->set_attribute( name = l_name *value = l_value ). *BatchNumber l_element_BatchNumber = l_document->create_simple_element( name = 'BatchNumber' value = '20100609001' parent = l_element_ArchiveBatch ). *TotalFiles l_element_TotalFiles = l_document->create_simple_element( name = 'TotalFiles' value = '5' parent = l_element_ArchiveBatch ). *TotalVolumes l_element_TotalVolumes = l_document->create_simple_element( name = 'TotalVolumes' value = '3' parent = l_element_ArchiveBatch ). *TotalPieces l_element_TotalPieces = l_document->create_simple_element( name = 'TotalPieces' value = '5' parent = l_element_ArchiveBatch ). *Entries l_element_Entries = l_document->create_simple_element( name = 'Entries' parent = l_element_ArchiveBatch ). *Entry1 l_element_Entry = l_document->create_simple_element( name = 'Entry' parent = l_element_Entries ). *Entry1下面的子项 *RecordsCombiningType l_element_RecordsCombiningType = l_document->create_simple_element( name = 'RecordsCombiningType' value = 'Volume' parent = l_element_Entry ). *FilePath l_element_FilePath = l_document->create_simple_element( name = 'FilePath' value = '全宗001/目录001/案卷001/档案一.docx' parent = l_element_Entry ). *SourceFileName l_element_SourceFileName = l_document->create_simple_element( name = 'SourceFileName' value = '档案一' parent = l_element_Entry ). *ClassificationCode l_element_ClassificationCode = l_document->create_simple_element( name = 'ClassificationCode' value = 'wenshu' parent = l_element_Entry ). *ElectronicRecordCode l_element_ElectronicRecordCode = l_document->create_simple_element( name = 'ElectronicRecordCode' value = 'BJSH-001' parent = l_element_Entry ). *Entry1 * Creating a stream factory l_streamfactory = l_ixml->create_stream_factory( ). * Connect internal XML table to stream factory l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ). * Rendering the document l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ). l_rc = l_renderer->render( ). * Saving the XML document l_xml_size = l_ostream->get_num_written_raw( ). CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = l_xml_size filename = 'c:\temp\metas.xml' filetype = 'BIN' CHANGING data_tab = l_xml_table EXCEPTIONS OTHERS = 24. IF sy-subrc 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值