应外维系统要求发出格式 字段 带有双引号 而标准json解析封装方法中 没有带引号的拼接,故需要重新copy出来标准类方法 改改可用
DATA: lo_json_ser TYPE REF TO zcl_trex_json_serializer, “封装json格式”
lo_json_des TYPE REF TO zcl_trex_json_deserializer. “解json格式”
DATA: json_string TYPE string.
METHOD recurse.
DATA:
l_type TYPE c,
l_comps TYPE i,
l_lines TYPE i,
l_index TYPE i,
l_value TYPE string.
FIELD-SYMBOLS:
<itab> TYPE ANY TABLE,
<comp> TYPE any.
DESCRIBE FIELD data TYPE l_type COMPONENTS l_comps .
IF l_type = cl_abap_typedescr=>typekind_table .
* itab -> array
APPEND '[' TO me->fragments .
ASSIGN data TO <itab> .
l_lines = lines( <itab> ) .
LOOP AT <itab> ASSIGNING <comp> .
ADD 1 TO l_index .
recurse( <comp> ) .
IF l_index < l_lines .
APPEND c_comma TO me->fragments .
ENDIF .
ENDLOOP .
APPEND ']' TO fragments .
ELSE .
IF l_comps IS INITIAL .
* field -> scalar
* todo: format
l_value = data .
REPLACE ALL OCCURRENCES OF '\' IN l_value WITH '\\' .
REPLACE ALL OCCURRENCES OF '''' IN l_value WITH '\''' .
REPLACE ALL OCCURRENCES OF '"' IN l_value WITH '\"' .
REPLACE ALL OCCURRENCES OF '&' IN l_value WITH '\&' .
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN l_value WITH '\r\n' .
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN l_value WITH '\n' .
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN l_value WITH '\t' .
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>backspace IN l_value WITH '\b' .
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>form_feed IN l_value WITH '\f' .
CONCATENATE '"' l_value '"' INTO l_value .
IF l_type = 'P'.
CONDENSE l_value NO-GAPS.
ENDIF.
APPEND l_value TO me->fragments .
ELSE .
* structure -> object
DATA l_typedescr TYPE REF TO cl_abap_structdescr .
FIELD-SYMBOLS <abapcomp> TYPE abap_compdescr .
APPEND '{' TO me->fragments .
l_typedescr ?= cl_abap_typedescr=>describe_by_data( data ) .
LOOP AT l_typedescr->components ASSIGNING <abapcomp> .
l_index = sy-tabix .
CONCATENATE '"' <abapcomp>-name '"' c_colon INTO l_value . “增加代码”
TRANSLATE l_value TO LOWER CASE .
APPEND l_value TO me->fragments .
ASSIGN COMPONENT <abapcomp>-name OF STRUCTURE data TO <comp> .
recurse( <comp> ) .
IF l_index < l_comps .
APPEND c_comma TO me->fragments .
ENDIF .
ENDLOOP .
APPEND '}' TO me->fragments .
ENDIF .
ENDIF .
ENDMETHOD.
解析json格式转换为内表
method DESERIALIZE_NODE.
data:
l_len type i ,
l_string type string ,
l_number type string .
find regex '\{|\[|"([^"]*)"|(\d+)' in section offset offset of json
match offset offset match length l_len
submatches l_string l_number .
if sy-subrc <> 0 .
exit.
"raise exception type cx_trex_serialization .
endif .
case json+offset(1) .
when '{' .
deserialize_object(
exporting
json = json
changing
offset = offset
node = node ) .
when '[' .
***Begin of insert DAB001 20190514
DATA:offset1 TYPE i.
DATA:offset2 TYPE i.
CLEAR:offset1,offset2.
find regex '\]' in section offset offset of json match offset offset1 .
if sy-subrc = 0 .
offset2 = offset1 - offset.
offset = offset1 + 1.
IF offset2 > 4.
***End of insert DAB001 20190514
deserialize_array(
exporting
json = json
changing
offset = offset
node = node ) .
***Begin of insert DAB001 20190514
ENDIF.
endif .
***End of insert DAB001 20190514
when '"' .
node = l_string .
add l_len to offset .
when others . "0-9
node = l_number .
add l_len to offset .
endcase .
endmethod.
DATA: lo_json_ser TYPE REF TO zcl_trex_json_serializer,
lo_json_des TYPE REF TO zcl_trex_json_deserializer.
DATA: json_string TYPE string.
DATA:ls_out TYPE zscrmorder_out, “创建与json相对的结构” 封装
ls_in TYPE zscrmorder_out, “创建与json相对的结构” 解析
lt_item TYPE zscrmorder_out_items,
ls_item TYPE zscrmorder_out_item,
output TYPE zcommon_webservice_request1,
input TYPE zcommon_webservice_response1
**发出
CREATE OBJECT lo_json_ser
EXPORTING
data = ls_out.
CALL METHOD lo_json_ser->serialize.
CALL METHOD lo_json_ser->get_data
RECEIVING
rval = json_string.
"赋值
CLEAR output.
output-into_json = json_string.
**解析
CREATE OBJECT lo_json_des.
CALL METHOD lo_json_des->deserialize
EXPORTING
json = input-return
IMPORTING
abap = ls_in.
IF ls_in-type = 'S'.
lv_msgty = 'S'.
lv_msgtx = '成功'.
ELSEIF ls_in-type = 'E'.
lv_msgty = ls_in-type.
lv_msgtx = ls_in-msg.
ENDIF.