Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions src/json/zcl_abapgit_ajson.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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,
Expand Down Expand Up @@ -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(
Expand Down
5 changes: 4 additions & 1 deletion src/json/zcl_abapgit_ajson.clas.locals_imp.abap
Original file line number Diff line number Diff line change
Expand Up @@ -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 <root> LIKE LINE OF ct_nodes.
FIELD-SYMBOLS <tab> TYPE ANY TABLE.
Expand Down Expand Up @@ -1196,8 +1197,9 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
ls_next_prefix-path = is_prefix-path && is_prefix-name && '/'.
ASSIGN iv_data TO <tab>.

lv_tabix = 1.
LOOP AT <tab> ASSIGNING <val>.
ls_next_prefix-name = to_lower( |{ sy-tabix }| ).
ls_next_prefix-name = to_lower( |{ lv_tabix }| ).

convert_any(
EXPORTING
Expand All @@ -1209,6 +1211,7 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
ct_nodes = ct_nodes ).

<root>-children = <root>-children + 1.
lv_tabix = lv_tabix + 1.
ENDLOOP.

ENDMETHOD.
Expand Down
55 changes: 55 additions & 0 deletions src/json/zcl_abapgit_ajson.clas.testclasses.abap
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down
7 changes: 7 additions & 0 deletions src/json/zif_abapgit_ajson_writer.intf.abap
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down