第一开始提问分析下面代码
class ZCL_DDIC_TO_JSON definition
public
final
create public .
public section.
types:
BEGIN OF ts_s_level,
level TYPE i, " ZLEVERL type i fieldtext level
position TYPE tabfdpos,
filedname TYPE fieldname,
inttype TYPE inttype,
rollname TYPE rollname,
ddtext TYPE ddtext,
rollnameup TYPE rollname,
END OF ts_s_level .
types:
tt_t_level TYPE TABLE OF ts_s_level .
types:
tt_t_rollname TYPE RANGE OF rollname .
class-data GT_LEVEL type TT_T_LEVEL .
methods SHOW_ALV
importing
!IT_TAB type TT_T_LEVEL .
class-methods DDIC_TO_JSON
importing
!IV_TCHECK type CHAR1 optional
!IV_OUTPUT type CHAR1 optional
!IV_DATA type ROLLNAME
value(IV_FIELDNAME) type FIELDNAME
returning
value(EV_JSON) type STRING .
PROTECTED SECTION.
PRIVATE SECTION.
CLASS-METHODS get_table
IMPORTING
VALUE(it_rollname) TYPE tt_t_rollname
VALUE(iv_level) TYPE int4 .
CLASS-METHODS convert_to_json
IMPORTING
!it_tab TYPE tt_t_level OPTIONAL
!is_level TYPE ts_s_level OPTIONAL
!iv_data TYPE rollname OPTIONAL
CHANGING
VALUE(iv_json) TYPE string OPTIONAL .
ENDCLASS.
CLASS ZCL_DDIC_TO_JSON IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Private Method ZCL_DDIC_TO_JSON=>CONVERT_TO_JSON
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_TAB TYPE TT_T_LEVEL(optional)
* | [--->] IS_LEVEL TYPE TS_S_LEVEL(optional)
* | [--->] IV_DATA TYPE ROLLNAME(optional)
* | [<-->] IV_JSON TYPE STRING(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD convert_to_json.
DATA:ls_level TYPE ts_s_level,
lv_lines TYPE i,
lv_levelnew TYPE i.
* Exclude duplicate data at the same level bein
TYPES: BEGIN OF ts_s_field,
fieldname TYPE fieldname,
rollname TYPE rollname,
END OF ts_s_field.
DATA:lt_field TYPE TABLE OF ts_s_field.
*Exclude duplicate data at the same level bein
IF is_level IS INITIAL.
DATA(lr_typedescrnew) = cl_abap_typedescr=>describe_by_name( iv_data ) .
CASE lr_typedescrnew->kind.
WHEN cl_abap_typedescr=>kind_struct.
MOVE '{' TO iv_json.
WHEN cl_abap_typedescr=>kind_table.
MOVE '[{' TO iv_json.
ENDCASE.
LOOP AT it_tab ASSIGNING FIELD-SYMBOL(<ls_level>) WHERE level = 1.
IF sy-tabix NE 1.
CONCATENATE iv_json ',' INTO iv_json.
ENDIF.
IF <ls_level>-inttype = 'u' OR <ls_level>-inttype = 'h' OR <ls_level>-inttype = 'v'.
CLEAR:ls_level.
ls_level = CORRESPONDING #( <ls_level> ).
CALL METHOD zcl_ddic_to_json=>convert_to_json
EXPORTING
is_level = ls_level
CHANGING
iv_json = iv_json.
ELSE.
CONCATENATE iv_json '"' <ls_level>-filedname '"' ':' '"' <ls_level>-ddtext '"' INTO iv_json.
ENDIF.
ENDLOOP.
CASE lr_typedescrnew->kind.
WHEN cl_abap_typedescr=>kind_struct.
CONCATENATE iv_json '}' INTO iv_json.
WHEN cl_abap_typedescr=>kind_table.
CONCATENATE iv_json '}]' INTO iv_json.
ENDCASE.
ELSE.
IF is_level-inttype = 'h'.
CONCATENATE iv_json '"' is_level-filedname '"' ':' '[' '{' INTO iv_json.
ELSEIF is_level-inttype = 'u' OR is_level-inttype = 'v'.
CONCATENATE iv_json '"' is_level-filedname '"' ':' '{' INTO iv_json.
ENDIF.
CLEAR:lv_lines.
CLEAR:lv_levelnew.
lv_levelnew = is_level-level + 1.
CLEAR:lt_field.
LOOP AT gt_level ASSIGNING <ls_level> WHERE rollnameup = is_level-rollname AND
level = lv_levelnew.
APPEND INITIAL LINE TO lt_field ASSIGNING FIELD-SYMBOL(<ls_field>).
<ls_field>-fieldname