diff --git a/src/aff_types/zcl_abapgit_json_handler.clas.abap b/src/aff_types/zcl_abapgit_json_handler.clas.abap new file mode 100644 index 000000000..e5b681c8c --- /dev/null +++ b/src/aff_types/zcl_abapgit_json_handler.clas.abap @@ -0,0 +1,79 @@ +CLASS zcl_abapgit_json_handler DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + PUBLIC SECTION. + + "! Serializes data to xstring. Type of data is specified in the + "! implementing class. + "! + "! @parameter iv_data | data to be serialized + "! @parameter rv_result | serialized data + METHODS serialize + IMPORTING iv_data TYPE data + RETURNING VALUE(rv_result) TYPE xstring + RAISING cx_static_check. + + "! Deserializes xstring into data. The type of data is specified in + "! the implementing class + "! + "! @parameter iv_content | xstring to be deserialized + "! @parameter ev_data | data of the xstring + METHODS deserialize + IMPORTING iv_content TYPE xstring + EXPORTING ev_data TYPE data + RAISING cx_static_check. + PROTECTED SECTION. + + PRIVATE SECTION. + + +ENDCLASS. + + + +CLASS zcl_abapgit_json_handler IMPLEMENTATION. + + + METHOD deserialize. + DATA lv_json TYPE string. + DATA lo_ajson TYPE REF TO zcl_abapgit_ajson. + DATA lo_mapping TYPE REF TO zif_abapgit_ajson_mapping. + + CLEAR ev_data. + + lv_json = zcl_abapgit_convert=>xstring_to_string_utf8( iv_content ). + lo_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( ). + + lo_ajson = zcl_abapgit_ajson=>parse( iv_json = lv_json + ii_custom_mapping = lo_mapping ). + + lo_ajson->zif_abapgit_ajson~to_abap( IMPORTING ev_container = ev_data ). + + ENDMETHOD. + + + METHOD serialize. + DATA lt_st_source TYPE abap_trans_srcbind_tab. + DATA lo_mapping TYPE REF TO lcl_mapping. + DATA lv_json TYPE string. + DATA lo_ajson TYPE REF TO zcl_abapgit_ajson. + + FIELD-SYMBOLS: LIKE LINE OF lt_st_source. + + APPEND INITIAL LINE TO lt_st_source ASSIGNING . + GET REFERENCE OF iv_data INTO -value. + CREATE OBJECT lo_mapping. + + lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = lo_mapping ). + lo_ajson->keep_item_order( ). + lo_ajson->set( + iv_path = '/' + iv_val = iv_data ). + + lv_json = lo_ajson->stringify( 2 ). + + rv_result = zcl_abapgit_convert=>string_to_xstring_utf8( iv_string = lv_json ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/aff_types/zcl_abapgit_json_handler.clas.locals_imp.abap b/src/aff_types/zcl_abapgit_json_handler.clas.locals_imp.abap new file mode 100644 index 000000000..1c51a6b9a --- /dev/null +++ b/src/aff_types/zcl_abapgit_json_handler.clas.locals_imp.abap @@ -0,0 +1,27 @@ +*"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations +CLASS lcl_mapping DEFINITION. + PUBLIC SECTION. + INTERFACES zif_abapgit_ajson_mapping. +ENDCLASS. + +CLASS lcl_mapping IMPLEMENTATION. + METHOD zif_abapgit_ajson_mapping~to_abap. + ENDMETHOD. + + METHOD zif_abapgit_ajson_mapping~to_json. + TYPES ty_token TYPE c LENGTH 255. + DATA lt_tokens TYPE STANDARD TABLE OF ty_token. + FIELD-SYMBOLS LIKE LINE OF lt_tokens. + + rv_result = iv_name. + + SPLIT rv_result AT `_` INTO TABLE lt_tokens. + LOOP AT lt_tokens ASSIGNING FROM 2. + TRANSLATE (1) TO UPPER CASE. + ENDLOOP. + CONCATENATE LINES OF lt_tokens INTO rv_result. + + ENDMETHOD. +ENDCLASS. diff --git a/src/aff_types/zcl_abapgit_json_handler.clas.testclasses.abap b/src/aff_types/zcl_abapgit_json_handler.clas.testclasses.abap new file mode 100644 index 000000000..c91075cc0 --- /dev/null +++ b/src/aff_types/zcl_abapgit_json_handler.clas.testclasses.abap @@ -0,0 +1,57 @@ +CLASS ltc_json_handler DEFINITION FOR TESTING + DURATION SHORT RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: exp TYPE zif_abapgit_aff_intf_v1=>ty_main, + json_as_xstring TYPE xstring. + METHODS setup. + METHODS first_test_name FOR TESTING RAISING cx_static_check. + +ENDCLASS. + + + +CLASS ltc_json_handler IMPLEMENTATION. + + METHOD setup. + exp = VALUE zif_abapgit_aff_intf_v1=>ty_main( + format_version = `1` + header = VALUE #( description = `Example interface for ABAP file formats` + original_language = 'E' + abap_language_version = 'X' ) + ). + + DATA(json_str_tabl) = VALUE string_table( + ( `{` ) + ( ` "formatVersion": "1",` ) + ( ` "header": {` ) + ( ` "description": "Example interface for ABAP file formats",` ) + ( ` "originalLanguage": "en"` ) + ( ` }` ) + ( `}` ) ). + DATA json_string TYPE string. + json_string = concat_lines_of( table = json_str_tabl sep = cl_abap_char_utilities=>newline ). + json_as_xstring = cl_abap_codepage=>convert_to( json_string ). + ENDMETHOD. + + + METHOD first_test_name. + DATA lo_ajson TYPE REF TO zcl_abapgit_json_handler. + CREATE OBJECT lo_ajson. + + DATA act TYPE zif_abapgit_aff_intf_v1=>ty_main. + + TRY. + CALL METHOD lo_ajson->('DESERIALIZE') + EXPORTING + iv_content = json_as_xstring + IMPORTING + ev_data = act. + CATCH cx_static_check. + ENDTRY. + + cl_abap_unit_assert=>assert_equals( act = act + exp = exp ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/aff_types/zcl_abapgit_json_handler.clas.xml b/src/aff_types/zcl_abapgit_json_handler.clas.xml new file mode 100644 index 000000000..83bc894c0 --- /dev/null +++ b/src/aff_types/zcl_abapgit_json_handler.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_JSON_HANDLER + E + abapGit - The object handler for JSON parsing + 1 + X + X + X + X + + + +