Menu

Example 2

joomp.de

This ABAP report is included in the addon package.

&---------------------------------------------------------------------
& Report /CEX/JMP_JSON_EXAMPLE2
&---------------------------------------------------------------------
& This is example code to show the usage of JSON within ABAP
& Store ABAP types into JSON objects for transferring to external
& applications. Map inbound JSON data back to (complex) ABAP objects
&---------------------------------------------------------------------
& (c) 2014 joomp.de
& last changed 2014/02/05
&---------------------------------------------------------------------
REPORT /cex/jmp_json_example2 NO STANDARD PAGE HEADING LINE-SIZE 1023.

  • -------- interface
    PARAMETERS: p_max TYPE sqf_max_rows DEFAULT 10.

  • -------- local data
    DATA: lr_json TYPE REF TO /cex/cl_jmp_json.
    DATA: lr_mapper TYPE REF TO /cex/cl_jmp_json_mapper.
    DATA: lr_output TYPE REF TO /cex/cl_jmp_json_object.
    DATA: lr_jdata TYPE REF TO /cex/if_jmp_json.
    DATA: lr_parsed TYPE REF TO /cex/if_jmp_json.
    DATA: lr_input TYPE REF TO /cex/cl_jmp_json_object.

DATA: lv_output TYPE string.
DATA: lv_message TYPE string.
DATA: lv_lin TYPE i.

DATA: lr_sflight_t TYPE REF TO /cex/cl_jmp_json_array.
DATA: lr_sflight_s TYPE REF TO /cex/cl_jmp_json_object.
DATA: lv_sflight_s TYPE string.
DATA: lt_sflight TYPE TABLE OF sflight.
DATA: ls_sflight LIKE LINE OF lt_sflight.
DATA: ls_usr02 TYPE usr02.

DATA: BEGIN OF ls_complex,
table_sflight TYPE TABLE OF sflight,
struc_sflight TYPE sflight,
string_sflight TYPE string,
date_sflight TYPE sydatum,
integer_sflight TYPE i,
double_sflight TYPE /cex/jmp_json_double,
usr02 TYPE usr02,
END OF ls_complex.

FIELD-SYMBOLS: <field> TYPE data.

  • -------- local macro
    DEFINE write_struc.
    do.
  • bind field number #
    unassign <field>.
    assign component sy-index of structure &1 to <field>.
  • output
    if <field> is assigned.
    write: / sy-index, <field>.
    else.
    exit. " from loop
    endif.
  • want to leave ?
    if &2 > 0 and sy-index > &2.
    exit.
    endif.
    enddo.
    END-OF-DEFINITION.

  • --------- ACTION
    START-OF-SELECTION.

  • -------- 0) select some data

  • sflight
    SELECT * FROM sflight
    INTO TABLE lt_sflight
    UP TO p_max ROWS.
    DESCRIBE TABLE lt_sflight LINES lv_lin.
    IF lv_lin EQ 0.
    WRITE: / 'No data selected in table SFLIGHT'.
    EXIT.
    ELSE.
    WRITE: / 'Zeilen gelesen:', lv_lin.
    ULINE.
    ENDIF.
    READ TABLE lt_sflight INTO ls_sflight INDEX 1.

  • usr02
    SELECT SINGLE * FROM usr02
    INTO ls_usr02
    WHERE bname = sy-uname.
    write_struc ls_usr02 15.

  • -------- 1) get the main json handler
    lr_json = /cex/cl_jmp_json=>get_instance( ).

  • -------- 2) get the mapper and an empty output object
    lr_mapper = lr_json->get_mapper( ).
    lr_output = lr_json->new_object( ).

  • -------- 3) add different data types to json object

  • table example
    CLEAR lr_jdata.
    lr_jdata = lr_mapper->map_to_json( lt_sflight ).
    IF lr_jdata IS NOT INITIAL.
    lr_output->put( iv_id = 'table_sflight' ir_data = lr_jdata ).
    ENDIF.
  • structure example
    CLEAR lr_jdata.
    lr_jdata = lr_mapper->map_to_json( ls_sflight ).
    IF lr_jdata IS NOT INITIAL.
    lr_output->put( iv_id = 'struc_sflight' ir_data = lr_jdata ).
    ENDIF.
  • string example
    CLEAR lr_jdata.
    lr_jdata = lr_mapper->map_to_json( ls_sflight-carrid ).
    IF lr_jdata IS NOT INITIAL.
    lr_output->put( iv_id = 'string_sflight' ir_data = lr_jdata ).
    ENDIF.
  • date example
    CLEAR lr_jdata.
    lr_jdata = lr_mapper->map_to_json( ls_sflight-fldate ).
    IF lr_jdata IS NOT INITIAL.
    lr_output->put( iv_id = 'date_sflight' ir_data = lr_jdata ).
    ENDIF.
  • integer example
    CLEAR lr_jdata.
    lr_jdata = lr_mapper->map_to_json( ls_sflight-seatsmax ).
    IF lr_jdata IS NOT INITIAL.
    lr_output->put( iv_id = 'integer_sflight' ir_data = lr_jdata ).
    ENDIF.
  • double example
    CLEAR lr_jdata.
    lr_jdata = lr_mapper->map_to_json( ls_sflight-paymentsum ).
    IF lr_jdata IS NOT INITIAL.
    lr_output->put( iv_id = 'double_sflight' ir_data = lr_jdata ).
    ENDIF.
  • struc with other data types example
    CLEAR lr_jdata.
    lr_jdata = lr_mapper->map_to_json( ls_usr02 ).
    IF lr_jdata IS NOT INITIAL.
    lr_output->put( iv_id = 'usr02' ir_data = lr_jdata ).
    ENDIF.

  • -------- 4) get the json as string for output, reset vars
    lv_output = lr_output->/cex/if_jmp_json~to_string( ).
    WRITE: / 'JSON String:'.
    WRITE: / lv_output.

REFRESH lt_sflight.
CLEAR ls_sflight.

  • ========================= PARSE STRING TO JSON
    ULINE.
  • -------- 5) get json data from output string
    lr_parsed = lr_json->parse( lv_output ).
    IF lr_parsed IS INITIAL.
    WRITE: / 'Error parsing json input'.
    EXIT.
    ENDIF.

  • -------- 6) map json to complex abap object
    CLEAR ls_complex.
    CALL METHOD lr_mapper->map_from_json
    EXPORTING
    ir_json = lr_parsed
    CHANGING
    cv_data = ls_complex
    cv_message = lv_message
    EXCEPTIONS
    failed = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    WRITE: / 'Errors occured while mapping json to abap:', lv_message.
    ELSE.

  • write the usr02 entry
    write_struc ls_complex-usr02 15.
    ULINE.
  • lt_sflight
    DESCRIBE TABLE ls_complex-table_sflight LINES lv_lin.
    WRITE: / 'Lines of SFLIGHT parsed from json string (complex):', lv_lin.
    ENDIF.

  • -------- 7) map json data to abap manually

  • the main json is an object
    lr_input ?= lr_parsed.

  • get the subobjects via known id
    lr_sflight_t = lr_input->get_array( 'table_sflight' ).
    lr_sflight_s = lr_input->get_object( 'struc_sflight' ).
    lv_sflight_s = lr_input->get_string( 'string_sflight' ).

  • read data back to lt_sflight
    IF lr_sflight_t IS INITIAL.
    WRITE: / 'table sflight not in json input'.
    ELSE.
    REFRESH lt_sflight.
    CALL METHOD lr_mapper->map_from_json
    EXPORTING

  • is_ddic =
    ir_json = lr_sflight_t
    CHANGING
    cv_data = lt_sflight
    cv_message = lv_message
    EXCEPTIONS
    failed = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    WRITE: / 'Errors occured while mapping json to abap'.
    ELSE.
    DESCRIBE TABLE lt_sflight LINES lv_lin.
    WRITE: / 'Lines of SFLIGHT parsed from json string (manual) :', lv_lin.
    ENDIF.
    ENDIF.

  • read data back to ls_sflight
    IF lr_sflight_s IS INITIAL.
    WRITE: / 'structure sflight is not in json input'.
    ELSE.
    CLEAR ls_sflight.
    CALL METHOD lr_mapper->map_from_json
    EXPORTING
    ir_json = lr_sflight_s
    CHANGING
    cv_data = ls_sflight
    cv_message = lv_message
    EXCEPTIONS
    failed = 1
    OTHERS = 2.
    IF sy-subrc <> 0.
    WRITE: / 'Errors occured while mapping json to abap'.
    ELSE.
    WRITE: / 'Fields SFLIGHT read from json:'.

  • write all cols of this structure
    write_struc ls_sflight 15.
    ENDIF.
    ENDIF.

Related

Wiki: Home

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.