diff --git a/src/z_ui2_json.clas.abap b/src/z_ui2_json.clas.abap index c7d3b73..263f9ee 100644 --- a/src/z_ui2_json.clas.abap +++ b/src/z_ui2_json.clas.abap @@ -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. diff --git a/src/z_ui2_json.clas.testclasses.abap b/src/z_ui2_json.clas.testclasses.abap index 97a5132..88d64e8 100644 --- a/src/z_ui2_json.clas.testclasses.abap +++ b/src/z_ui2_json.clas.testclasses.abap @@ -292,6 +292,8 @@ INHERITING FROM z_ui2_json. "! test error message with path to the field with an invalid value
"! 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 * ---------------------------------------------------------------------- @@ -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