Skip to content
Merged
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
23 changes: 21 additions & 2 deletions src/z_ui2_json.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -2468,14 +2468,33 @@ ENDMETHOD.

METHOD DETECT_TYPEKIND.

DATA: domain_name TYPE domname,
inner_elemdescr TYPE REF TO cl_abap_elemdescr.

IF convexit IS NOT INITIAL.
rv_type = e_typekind-convexit.
ELSE.
rv_type = type_descr->type_kind.
IF rv_type EQ cl_abap_typedescr=>typekind_packed AND mv_ts_as_iso8601 EQ c_bool-true.
IF type_descr->absolute_name EQ '\TYPE=TIMESTAMP'.

IF type_descr->help_id IS NOT INITIAL AND NOT contains( val = type_descr->absolute_name end = type_descr->help_id ).
TRY.
inner_elemdescr ?= cl_abap_elemdescr=>describe_by_name( type_descr->help_id ).
IF inner_elemdescr->is_ddic_type( ).
domain_name = inner_elemdescr->get_ddic_field( )-domname.
ENDIF.
CATCH cx_root.
domain_name = ''.
ENDTRY.
ELSE.
IF type_descr->is_ddic_type( ).
domain_name = type_descr->get_ddic_field( )-domname.
ENDIF.
ENDIF.

IF domain_name EQ 'TZNTSTMPS' OR domain_name EQ 'XSDDATETIME_Z'. " domain of TIMESTAMP is TZNTSTMPS
rv_type = e_typekind-ts_iso8601.
ELSEIF type_descr->absolute_name EQ '\TYPE=TIMESTAMPL'.
ELSEIF domain_name EQ 'TZNTSTMPL' OR domain_name EQ 'XSDDATETIME_LONG_Z'.
rv_type = e_typekind-tsl_iso8601.
ENDIF.
ELSEIF rv_type EQ cl_abap_typedescr=>typekind_num AND mv_numc_as_string EQ abap_true.
Expand Down
39 changes: 39 additions & 0 deletions src/z_ui2_json.clas.testclasses.abap
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,8 @@ INHERITING FROM z_ui2_json.
"! test error message with path to the field with an invalid value<br/>
"! try to deserialize a JSON string with an invalid value for a string type
METHODS deser_field_invalid_value FOR TESTING.
"! serialized timestamps with domain XSDDATETIME_Z
METHODS serialize_time_stamp FOR TESTING.

ENDCLASS. "abap_unit_testclass
* ----------------------------------------------------------------------
Expand Down Expand Up @@ -3229,4 +3231,41 @@ CLASS abap_unit_testclass IMPLEMENTATION.

ENDMETHOD.

METHOD serialize_time_stamp.
DATA test_xsd_tms TYPE xsddatetime_z.

GET TIME STAMP FIELD DATA(tms_t).
test_xsd_tms = '19370101120027' .
DATA(ser_tms) = NEW Z_UI2_JSON( ts_as_iso8601 = abap_true )->serialize_int( test_xsd_tms ).
cl_abap_unit_assert=>assert_equals(
exp = '"1937-01-01T12:00:27Z"'
act = ser_tms ).

deserialize(
EXPORTING json = '"1937-01-01T12:00:27"'
CHANGING data = test_xsd_tms
).
cl_abap_unit_assert=>assert_equals(
exp = '19370101120027'
act = test_xsd_tms ).


TYPES ty_tms TYPE xsddatetime_z.
DATA test_xsd_tms2 TYPE ty_tms.
test_xsd_tms2 = '19370101120027' .
DATA(ser_tms2) = NEW Z_UI2_JSON( ts_as_iso8601 = abap_true )->serialize_int( test_xsd_tms2 ).
cl_abap_unit_assert=>assert_equals(
exp = '"1937-01-01T12:00:27Z"'
act = ser_tms2 ).

deserialize(
EXPORTING json = '"1937-01-01T12:00:27"'
CHANGING data = test_xsd_tms2
).
cl_abap_unit_assert=>assert_equals(
exp = '19370101120027'
act = test_xsd_tms2 ).

ENDMETHOD.

ENDCLASS. "abap_unit_testclass