[AFF] JSON handler based on AJSON: deserialize

Minimal example in UT.
UT is RED, since AJSON does not yet match the ST behavior

// the change might be cherry-picked when AFF types are provided in abapGit
This commit is contained in:
Dr. Albert Mink 2022-06-22 08:48:22 +00:00 committed by Albert Mink
parent 89ae84b4fc
commit 149d2a86c3
4 changed files with 180 additions and 0 deletions

View File

@ -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: <lg_source> LIKE LINE OF lt_st_source.
APPEND INITIAL LINE TO lt_st_source ASSIGNING <lg_source>.
GET REFERENCE OF iv_data INTO <lg_source>-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.

View File

@ -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 <lg_token> LIKE LINE OF lt_tokens.
rv_result = iv_name.
SPLIT rv_result AT `_` INTO TABLE lt_tokens.
LOOP AT lt_tokens ASSIGNING <lg_token> FROM 2.
TRANSLATE <lg_token>(1) TO UPPER CASE.
ENDLOOP.
CONCATENATE LINES OF lt_tokens INTO rv_result.
ENDMETHOD.
ENDCLASS.

View File

@ -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.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_JSON_HANDLER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - The object handler for JSON parsing</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>