mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 20:03:20 +08:00
[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:
parent
89ae84b4fc
commit
149d2a86c3
79
src/aff_types/zcl_abapgit_json_handler.clas.abap
Normal file
79
src/aff_types/zcl_abapgit_json_handler.clas.abap
Normal 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.
|
27
src/aff_types/zcl_abapgit_json_handler.clas.locals_imp.abap
Normal file
27
src/aff_types/zcl_abapgit_json_handler.clas.locals_imp.abap
Normal 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.
|
57
src/aff_types/zcl_abapgit_json_handler.clas.testclasses.abap
Normal file
57
src/aff_types/zcl_abapgit_json_handler.clas.testclasses.abap
Normal 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.
|
17
src/aff_types/zcl_abapgit_json_handler.clas.xml
Normal file
17
src/aff_types/zcl_abapgit_json_handler.clas.xml
Normal 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>
|
Loading…
Reference in New Issue
Block a user