原始JSON:
{
"result": {
"10005005": {
"msg": "操作失败",
"code": "-1"
},
"10005006": {
"msg": "操作失败",
"code": "-1"
}
},
"code": "1"
}
需求是需要拿到订单编号‘10005005’及对应的msg和code的值,由于订单编号是动态的,所以常规的方式是不行的,但是可以借助系统标准工具类cl_abap_structdescr来协助完成。
解决demo如下:
*&---------------------------------------------------------------------*
*& Report ZTEST_GET_JSON
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_get_json.
TYPES:
BEGIN OF ty_order_info,
order TYPE char10,
msg TYPE string,
code TYPE char2,
END OF ty_order_info,
tt_order_info TYPE STANDARD TABLE OF ty_order_info.
DATA:
lv_json TYPE string,
lr_data TYPE REF TO data,
lt_components TYPE abap_compdescr_tab.
DATA:
lt_order_info TYPE tt_order_info,
ls_order_info TYPE ty_order_info.
lv_json = `{"result":{"10005005":{"msg":"操作失败","code":"-1"},"10005006":{"msg":"操作失败","code":"-1"}},"code":"1"} `.
/ui2/cl_json=>deserialize(
EXPORTING
json = lv_json
pretty_name = /ui2/cl_json=>pretty_mode-user
assoc_arrays = abap_true
CHANGING
data = lr_data ).
ASSIGN lr_data->* TO FIELD-SYMBOL(<fs_data>).
ASSIGN COMPONENT 'RESULT' OF STRUCTURE <fs_data> TO FIELD-SYMBOL(<fs_items_ref>).
ASSIGN <fs_items_ref>->* TO FIELD-SYMBOL(<fs_items>).
PERFORM frm_get_comp USING <fs_items> CHANGING lt_components.
LOOP AT lt_components INTO DATA(ls_components).
ASSIGN COMPONENT ls_components-name OF STRUCTURE <fs_items> TO FIELD-SYMBOL(<fs_order_info_ref>).
ASSIGN <fs_order_info_ref>->* TO FIELD-SYMBOL(<fs_order_info>).
ls_order_info-order = ls_components-name.
ASSIGN COMPONENT 'MSG' OF STRUCTURE <fs_order_info> TO FIELD-SYMBOL(<fs_msg_ref>).
ASSIGN <fs_msg_ref>->* TO FIELD-SYMBOL(<fs_msg>).
ASSIGN COMPONENT 'CODE' OF STRUCTURE <fs_order_info> TO FIELD-SYMBOL(<fs_code_ref>).
ASSIGN <fs_code_ref>->* TO FIELD-SYMBOL(<fs_code>).
ls_order_info-msg = <fs_msg>.
ls_order_info-code = <fs_code>.
APPEND ls_order_info TO lt_order_info.
CLEAR ls_order_info.
ENDLOOP.
cl_demo_output=>display( lt_order_info ).
FORM frm_get_comp USING us_data
CHANGING ct_comp TYPE abap_compdescr_tab.
DATA:
lo_descr_ref TYPE REF TO cl_abap_typedescr,
lo_struc TYPE REF TO cl_abap_structdescr.
CALL METHOD cl_abap_structdescr=>describe_by_data
EXPORTING
p_data = us_data
RECEIVING
p_descr_ref = lo_descr_ref.
lo_struc ?= lo_descr_ref.
ct_comp = lo_struc->components.
ENDFORM.
解析效果:
以上。