diff --git a/src/json/zcl_abapgit_ajson.clas.abap b/src/json/zcl_abapgit_ajson.clas.abap index 3033e2959..443603aeb 100644 --- a/src/json/zcl_abapgit_ajson.clas.abap +++ b/src/json/zcl_abapgit_ajson.clas.abap @@ -4,8 +4,6 @@ CLASS zcl_abapgit_ajson DEFINITION PUBLIC SECTION. - INTERFACES zif_abapgit_ajson_reader . - INTERFACES zif_abapgit_ajson_writer . INTERFACES zif_abapgit_ajson . ALIASES: @@ -29,6 +27,7 @@ CLASS zcl_abapgit_ajson DEFINITION set_string FOR zif_abapgit_ajson_writer~set_string, set_integer FOR zif_abapgit_ajson_writer~set_integer, set_date FOR zif_abapgit_ajson_writer~set_date, + set_timestamp FOR zif_abapgit_ajson_writer~set_timestamp, set_null FOR zif_abapgit_ajson_writer~set_null, delete FOR zif_abapgit_ajson_writer~delete, touch_array FOR zif_abapgit_ajson_writer~touch_array, @@ -652,6 +651,39 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_ajson_writer~set_timestamp. + + DATA: + lv_tz TYPE tznzone, + lv_date TYPE d, + lv_time TYPE t, + lv_timestamp_iso TYPE string. + + IF iv_val IS INITIAL. + " The zero value is January 1, year 1, 00:00:00.000000000 UTC. + lv_date = '00010101'. + ELSE. + + lv_tz = 'UTC'. + CONVERT TIME STAMP iv_val TIME ZONE lv_tz + INTO DATE lv_date TIME lv_time. + + ENDIF. + + lv_timestamp_iso = + lv_date+0(4) && '-' && lv_date+4(2) && '-' && lv_date+6(2) && + 'T' && + lv_time+0(2) && '-' && lv_time+2(2) && '-' && lv_time+4(2) && + 'Z'. + + zif_abapgit_ajson_writer~set( + iv_ignore_empty = abap_false + iv_path = iv_path + iv_val = lv_timestamp_iso ). + + ENDMETHOD. + + METHOD zif_abapgit_ajson_writer~stringify. rv_json = lcl_json_serializer=>stringify( diff --git a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap index e25628f6f..565f74f1e 100644 --- a/src/json/zcl_abapgit_ajson.clas.locals_imp.abap +++ b/src/json/zcl_abapgit_ajson.clas.locals_imp.abap @@ -1169,6 +1169,7 @@ CLASS lcl_abap_to_json IMPLEMENTATION. DATA lo_table TYPE REF TO cl_abap_tabledescr. DATA lo_ltype TYPE REF TO cl_abap_typedescr. DATA ls_next_prefix LIKE is_prefix. + DATA lv_tabix TYPE sy-tabix. FIELD-SYMBOLS LIKE LINE OF ct_nodes. FIELD-SYMBOLS TYPE ANY TABLE. @@ -1196,8 +1197,9 @@ CLASS lcl_abap_to_json IMPLEMENTATION. ls_next_prefix-path = is_prefix-path && is_prefix-name && '/'. ASSIGN iv_data TO . + lv_tabix = 1. LOOP AT ASSIGNING . - ls_next_prefix-name = to_lower( |{ sy-tabix }| ). + ls_next_prefix-name = to_lower( |{ lv_tabix }| ). convert_any( EXPORTING @@ -1209,6 +1211,7 @@ CLASS lcl_abap_to_json IMPLEMENTATION. ct_nodes = ct_nodes ). -children = -children + 1. + lv_tabix = lv_tabix + 1. ENDLOOP. ENDMETHOD. diff --git a/src/json/zcl_abapgit_ajson.clas.testclasses.abap b/src/json/zcl_abapgit_ajson.clas.testclasses.abap index ec3d1c0a0..01e44e8b8 100644 --- a/src/json/zcl_abapgit_ajson.clas.testclasses.abap +++ b/src/json/zcl_abapgit_ajson.clas.testclasses.abap @@ -1602,6 +1602,7 @@ CLASS ltcl_writer_test DEFINITION FINAL METHODS ignore_empty FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_obj FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_tab FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS set_tab_hashed FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS prove_path_exists FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS delete_subtree FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS delete FOR TESTING RAISING zcx_abapgit_ajson_error. @@ -1612,6 +1613,7 @@ CLASS ltcl_writer_test DEFINITION FINAL METHODS set_str FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_int FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_date FOR TESTING RAISING zcx_abapgit_ajson_error. + METHODS set_timestamp FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS read_only FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_array_obj FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS set_with_type FOR TESTING RAISING zcx_abapgit_ajson_error. @@ -1935,6 +1937,35 @@ CLASS ltcl_writer_test IMPLEMENTATION. ENDMETHOD. + METHOD set_tab_hashed. + + DATA lo_nodes TYPE REF TO lcl_nodes_helper. + DATA lo_cut TYPE REF TO zcl_abapgit_ajson. + DATA li_writer TYPE REF TO zif_abapgit_ajson_writer. + DATA lt_tab TYPE HASHED TABLE OF string WITH UNIQUE DEFAULT KEY. + + lo_cut = zcl_abapgit_ajson=>create_empty( ). + li_writer = lo_cut. + + INSERT `hello` INTO TABLE lt_tab. + INSERT `world` INTO TABLE lt_tab. + + " Prepare source + CREATE OBJECT lo_nodes. + lo_nodes->add( ' | |object | | |1' ). + lo_nodes->add( '/ |x |array | | |2' ). + lo_nodes->add( '/x/ |1 |str |hello|1|0' ). + lo_nodes->add( '/x/ |2 |str |world|2|0' ). + + li_writer->set( + iv_path = '/x' + iv_val = lt_tab ). + cl_abap_unit_assert=>assert_equals( + act = lo_cut->mt_json_tree + exp = lo_nodes->sorted( ) ). + + ENDMETHOD. + METHOD arrays. DATA lo_cut TYPE REF TO zcl_abapgit_ajson. @@ -2333,6 +2364,30 @@ CLASS ltcl_writer_test IMPLEMENTATION. ENDMETHOD. + METHOD set_timestamp. + + DATA lo_cut TYPE REF TO zcl_abapgit_ajson. + DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper. + DATA li_writer TYPE REF TO zif_abapgit_ajson_writer. + DATA lv_timestamp TYPE timestamp. + + lo_cut = zcl_abapgit_ajson=>create_empty( ). + li_writer = lo_cut. + CREATE OBJECT lo_nodes_exp. + lo_nodes_exp->add( ' | |object | ||1' ). + lo_nodes_exp->add( '/ |a |str |2021-05-05T12-00-00Z ||0' ). + + lv_timestamp = '20210505120000'. + li_writer->set_timestamp( + iv_path = '/a' + iv_val = lv_timestamp ). + + cl_abap_unit_assert=>assert_equals( + act = lo_cut->mt_json_tree + exp = lo_nodes_exp->sorted( ) ). + + ENDMETHOD. + METHOD read_only. DATA lo_cut TYPE REF TO zcl_abapgit_ajson. diff --git a/src/json/zif_abapgit_ajson_writer.intf.abap b/src/json/zif_abapgit_ajson_writer.intf.abap index 91c7a1c7e..ce8eb54c6 100644 --- a/src/json/zif_abapgit_ajson_writer.intf.abap +++ b/src/json/zif_abapgit_ajson_writer.intf.abap @@ -42,6 +42,13 @@ INTERFACE zif_abapgit_ajson_writer RAISING zcx_abapgit_ajson_error. + METHODS set_timestamp + IMPORTING + iv_path TYPE string + iv_val TYPE timestamp + RAISING + zcx_abapgit_ajson_error. + METHODS set_null IMPORTING iv_path TYPE string