一、内表转JSON
"-----------------------------@斌将军-----------------------------
TYPES: BEGIN OF ty_name_mapping,
abap TYPE abap_compname,
json TYPE string,
END OF ty_name_mapping.
TYPES:BEGIN OF ty_makt,
matnr TYPE makt-matnr,
spras TYPE makt-spras,
maktx TYPE makt-maktx,
END OF ty_makt.
DATA:gt_makt TYPE TABLE OF ty_makt,
gs_makt TYPE ty_makt.
DATA:ls_mappings TYPE ty_name_mapping,
lt_mappings TYPE HASHED TABLE OF ty_name_mapping WITH UNIQUE KEY abap.
DATA:lv_json TYPE string.
"填充内表数据
SELECT
matnr
spras
maktx
FROM makt
INTO TABLE gt_makt
WHERE spras = sy-langu.
"获取表结构字段
*SELECT
* tabname,
* fieldname
*FROM dd03l
*INTO TABLE @DATA(lt_dd03l)
*WHERE tabname = 'MAKT'
* AND as4local = 'A'.
*LOOP AT lt_dd03l INTO DATA(ls_dd03l).
* CLEAR:ls_mappings.
* ls_mappings-abap = ls_dd03l-fieldname.
* ls_mappings-json = ls_dd03l-fieldname.
* TRANSLATE ls_mappings-json TO LOWER CASE.
* INSERT ls_mappings INTO TABLE lt_mappings.
*ENDLOOP.
"内表的字段为大写,转成JSON的键需要小写,则要在转换时配置字段映射
"获取内表结构字段
DATA(lo_table_basic) = CAST cl_abap_tabledescr( cl_abap_tabledescr=>describe_by_data( gt_makt ) ).
DATA(lo_struct_basic) = CAST cl_abap_structdescr( lo_table_basic->get_table_line_type( ) ).
DATA(lt_dd03l) = lo_struct_basic->get_components( ).
"配置内表字段与JSON键的映射
LOOP AT lt_dd03l INTO DATA(ls_dd03l).
CLEAR:ls_mappings.
ls_mappings-abap = ls_dd03l-name.
ls_mappings-json = ls_dd03l-name.
TRANSLATE ls_mappings-json TO LOWER CASE.
INSERT ls_mappings INTO TABLE lt_mappings.
ENDLOOP.
"内表转JSON
lv_json = /ui2/cl_json=>serialize( data = gt_makt name_mappings = lt_mappings ).
WRITE:lv_json.
"-----------------------------@斌将军-----------------------------
二、JSON转内表
"-----------------------------@斌将军-----------------------------
"JSON转内表
REFRESH:gt_makt.
/ui2/cl_json=>deserialize( EXPORTING json = lv_json
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING data = gt_makt ).
"-----------------------------@斌将军-----------------------------