update ajson to latest (#4417)

This commit is contained in:
Lars Hvam 2021-01-18 09:37:18 +01:00 committed by GitHub
parent 47dae10ab0
commit 392562ef22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 784 additions and 46 deletions

View File

@ -13,10 +13,10 @@
"url": "git+https://github.com/abapGit/abapGit.git"
},
"devDependencies": {
"@abaplint/cli": "^2.64.3",
"@abaplint/transpiler-cli": "^1.1.24",
"@abaplint/runtime": "^1.1.24",
"@abaplint/cli": "^2.64.5",
"@abaplint/transpiler-cli": "^1.1.25",
"@abaplint/runtime": "^1.1.25",
"abapmerge": "^0.14.2",
"eslint": "^7.17.0"
"eslint": "^7.18.0"
}
}

View File

@ -41,14 +41,17 @@ CLASS zcl_abapgit_ajson DEFINITION
CLASS-METHODS parse
IMPORTING
!iv_json TYPE string
!iv_freeze TYPE abap_bool DEFAULT abap_false
!iv_json TYPE string
!iv_freeze TYPE abap_bool DEFAULT abap_false
!ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson
RAISING
zcx_abapgit_ajson_error .
CLASS-METHODS create_empty
IMPORTING
!ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_ajson.
@ -60,24 +63,25 @@ CLASS zcl_abapgit_ajson DEFINITION
tty_node_stack TYPE STANDARD TABLE OF REF TO zif_abapgit_ajson=>ty_node WITH DEFAULT KEY.
DATA mv_read_only TYPE abap_bool.
DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping.
DATA mv_keep_item_order TYPE abap_bool.
METHODS get_item
IMPORTING
iv_path TYPE string
iv_path TYPE string
RETURNING
VALUE(rv_item) TYPE REF TO zif_abapgit_ajson=>ty_node.
METHODS prove_path_exists
IMPORTING
iv_path TYPE string
iv_path TYPE string
RETURNING
VALUE(rt_node_stack) TYPE tty_node_stack
RAISING
zcx_abapgit_ajson_error.
METHODS delete_subtree
IMPORTING
iv_path TYPE string
iv_name TYPE string
iv_path TYPE string
iv_name TYPE string
RETURNING
VALUE(rv_deleted) TYPE abap_bool.
@ -90,6 +94,7 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION.
METHOD create_empty.
CREATE OBJECT ro_instance.
ro_instance->mi_custom_mapping = ii_custom_mapping.
ENDMETHOD.
@ -157,6 +162,7 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION.
CREATE OBJECT ro_instance.
CREATE OBJECT lo_parser.
ro_instance->mt_json_tree = lo_parser->parse( iv_json ).
ro_instance->mi_custom_mapping = ii_custom_mapping.
IF iv_freeze = abap_true.
ro_instance->freeze( ).
@ -402,9 +408,11 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION.
CLEAR ev_container.
lcl_json_to_abap=>bind(
EXPORTING
ii_custom_mapping = mi_custom_mapping
CHANGING
c_obj = ev_container
co_instance = lo_to_abap ).
c_obj = ev_container
co_instance = lo_to_abap ).
lo_to_abap->to_abap( mt_json_tree ).
ENDMETHOD.
@ -479,11 +487,9 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION.
METHOD zif_abapgit_ajson_writer~set.
DATA lt_path TYPE string_table.
DATA ls_split_path TYPE zif_abapgit_ajson=>ty_path_name.
DATA lr_parent TYPE REF TO zif_abapgit_ajson=>ty_node.
DATA lt_node_stack TYPE tty_node_stack.
FIELD-SYMBOLS <topnode> TYPE zif_abapgit_ajson=>ty_node.
IF mv_read_only = abap_true.
zcx_abapgit_ajson_error=>raise( 'This json instance is read only' ).
@ -504,14 +510,16 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION.
IF iv_node_type IS NOT INITIAL.
mt_json_tree = lcl_abap_to_json=>insert_with_type(
iv_keep_item_order = mv_keep_item_order
iv_data = iv_val
iv_type = iv_node_type
is_prefix = ls_split_path ).
iv_data = iv_val
iv_type = iv_node_type
is_prefix = ls_split_path
ii_custom_mapping = mi_custom_mapping ).
ELSE.
mt_json_tree = lcl_abap_to_json=>convert(
iv_keep_item_order = mv_keep_item_order
iv_data = iv_val
is_prefix = ls_split_path ).
iv_data = iv_val
is_prefix = ls_split_path
ii_custom_mapping = mi_custom_mapping ).
ENDIF.
RETURN.
ENDIF.
@ -539,16 +547,18 @@ CLASS zcl_abapgit_ajson IMPLEMENTATION.
IF iv_node_type IS NOT INITIAL.
lt_new_nodes = lcl_abap_to_json=>insert_with_type(
iv_keep_item_order = mv_keep_item_order
iv_data = iv_val
iv_type = iv_node_type
iv_array_index = lv_array_index
is_prefix = ls_split_path ).
iv_data = iv_val
iv_type = iv_node_type
iv_array_index = lv_array_index
is_prefix = ls_split_path
ii_custom_mapping = mi_custom_mapping ).
ELSE.
lt_new_nodes = lcl_abap_to_json=>convert(
iv_keep_item_order = mv_keep_item_order
iv_data = iv_val
iv_array_index = lv_array_index
is_prefix = ls_split_path ).
iv_data = iv_val
iv_array_index = lv_array_index
is_prefix = ls_split_path
ii_custom_mapping = mi_custom_mapping ).
ENDIF.
" update data

View File

@ -504,9 +504,11 @@ CLASS lcl_json_to_abap DEFINITION FINAL.
zcx_abapgit_ajson_error.
CLASS-METHODS bind
IMPORTING
!ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
CHANGING
c_obj TYPE any
co_instance TYPE REF TO lcl_json_to_abap.
c_obj TYPE any
co_instance TYPE REF TO lcl_json_to_abap.
METHODS to_abap
IMPORTING
@ -516,6 +518,8 @@ CLASS lcl_json_to_abap DEFINITION FINAL.
PRIVATE SECTION.
DATA mr_obj TYPE REF TO data.
DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping.
ENDCLASS.
CLASS lcl_json_to_abap IMPLEMENTATION.
@ -523,6 +527,7 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
METHOD bind.
CREATE OBJECT co_instance.
GET REFERENCE OF c_obj INTO co_instance->mr_obj.
co_instance->mi_custom_mapping = ii_custom_mapping.
ENDMETHOD.
METHOD to_abap.
@ -599,6 +604,7 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
DATA lt_path TYPE string_table.
DATA lv_trace TYPE string.
DATA lv_seg LIKE LINE OF lt_path.
DATA lv_type TYPE c.
DATA lv_size TYPE i.
DATA lv_index TYPE i.
@ -617,7 +623,19 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
LOOP AT lt_path ASSIGNING <seg>.
lv_trace = lv_trace && '/' && <seg>.
<seg> = to_upper( <seg> ).
IF mi_custom_mapping IS BOUND.
lv_seg = mi_custom_mapping->to_abap( iv_path = iv_path
iv_name = <seg> ).
ELSE.
CLEAR lv_seg.
ENDIF.
IF lv_seg IS INITIAL.
lv_seg = to_upper( <seg> ).
ELSE.
lv_seg = to_upper( lv_seg ).
ENDIF.
ASSIGN r_ref->* TO <struc>.
ASSERT sy-subrc = 0.
@ -630,12 +648,12 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
iv_location = lv_trace ).
ELSEIF lv_type = 'h'. " table
IF NOT <seg> CO '0123456789'.
IF NOT lv_seg CO '0123456789'.
zcx_abapgit_ajson_error=>raise(
iv_msg = 'Need index to access tables'
iv_location = lv_trace ).
ENDIF.
lv_index = <seg>.
lv_index = lv_seg.
ASSIGN r_ref->* TO <table>.
ASSERT sy-subrc = 0.
@ -652,7 +670,7 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
ENDIF.
ELSEIF lv_type CA 'uv'. " structure
ASSIGN COMPONENT <seg> OF STRUCTURE <struc> TO <value>.
ASSIGN COMPONENT lv_seg OF STRUCTURE <struc> TO <value>.
IF sy-subrc <> 0.
zcx_abapgit_ajson_error=>raise(
iv_msg = 'Path not found'
@ -679,24 +697,26 @@ CLASS lcl_abap_to_json DEFINITION FINAL.
CLASS-METHODS convert
IMPORTING
iv_data TYPE any
is_prefix TYPE zif_abapgit_ajson=>ty_path_name OPTIONAL
iv_array_index TYPE i DEFAULT 0
iv_data TYPE any
is_prefix TYPE zif_abapgit_ajson=>ty_path_name OPTIONAL
iv_array_index TYPE i DEFAULT 0
ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
iv_keep_item_order TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(rt_nodes) TYPE zif_abapgit_ajson=>ty_nodes_tt
VALUE(rt_nodes) TYPE zif_abapgit_ajson=>ty_nodes_tt
RAISING
zcx_abapgit_ajson_error.
CLASS-METHODS insert_with_type
IMPORTING
iv_data TYPE any
iv_type TYPE string
is_prefix TYPE zif_abapgit_ajson=>ty_path_name OPTIONAL
iv_array_index TYPE i DEFAULT 0
iv_data TYPE any
iv_type TYPE string
is_prefix TYPE zif_abapgit_ajson=>ty_path_name OPTIONAL
iv_array_index TYPE i DEFAULT 0
ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
iv_keep_item_order TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(rt_nodes) TYPE zif_abapgit_ajson=>ty_nodes_tt
VALUE(rt_nodes) TYPE zif_abapgit_ajson=>ty_nodes_tt
RAISING
zcx_abapgit_ajson_error.
@ -705,6 +725,7 @@ CLASS lcl_abap_to_json DEFINITION FINAL.
PRIVATE SECTION.
CLASS-DATA gv_ajson_absolute_type_name TYPE string.
DATA mi_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping.
DATA mv_keep_item_order TYPE abap_bool.
METHODS convert_any
@ -742,7 +763,6 @@ CLASS lcl_abap_to_json DEFINITION FINAL.
METHODS convert_ref
IMPORTING
iv_data TYPE any
io_type TYPE REF TO cl_abap_typedescr
is_prefix TYPE zif_abapgit_ajson=>ty_path_name
iv_index TYPE i DEFAULT 0
iv_item_order TYPE i DEFAULT 0
@ -808,7 +828,9 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
DATA lo_converter TYPE REF TO lcl_abap_to_json.
lo_type = cl_abap_typedescr=>describe_by_data( iv_data ).
CREATE OBJECT lo_converter.
lo_converter->mi_custom_mapping = ii_custom_mapping.
lo_converter->mv_keep_item_order = iv_keep_item_order.
lo_converter->convert_any(
@ -864,7 +886,6 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
convert_ref(
EXPORTING
iv_data = iv_data
io_type = io_type
is_prefix = is_prefix
iv_index = iv_index
iv_item_order = iv_item_order
@ -918,6 +939,15 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
<n>-index = iv_index.
<n>-order = iv_item_order.
IF mi_custom_mapping IS BOUND.
<n>-name = mi_custom_mapping->to_json( iv_path = is_prefix-path
iv_name = is_prefix-name ).
ENDIF.
IF <n>-name IS INITIAL.
<n>-name = is_prefix-name.
ENDIF.
IF io_type->absolute_name = '\TYPE-POOL=ABAP\TYPE=ABAP_BOOL' OR io_type->absolute_name = '\TYPE=XFELD'.
<n>-type = zif_abapgit_ajson=>node_type-boolean.
IF iv_data IS NOT INITIAL.
@ -949,6 +979,15 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
<n>-index = iv_index.
<n>-order = iv_item_order.
IF mi_custom_mapping IS BOUND.
<n>-name = mi_custom_mapping->to_json( iv_path = is_prefix-path
iv_name = is_prefix-name ).
ENDIF.
IF <n>-name IS INITIAL.
<n>-name = is_prefix-name.
ENDIF.
IF iv_data IS INITIAL.
<n>-type = zif_abapgit_ajson=>node_type-null.
<n>-value = 'null'.
@ -985,6 +1024,16 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
<root>-name = is_prefix-name.
<root>-type = zif_abapgit_ajson=>node_type-object.
<root>-index = iv_index.
IF mi_custom_mapping IS BOUND.
<root>-name = mi_custom_mapping->to_json( iv_path = is_prefix-path
iv_name = is_prefix-name ).
ENDIF.
IF <root>-name IS INITIAL.
<root>-name = is_prefix-name.
ENDIF.
<root>-order = iv_item_order.
ENDIF.
@ -1049,6 +1098,15 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
<root>-index = iv_index.
<root>-order = iv_item_order.
IF mi_custom_mapping IS BOUND.
<root>-name = mi_custom_mapping->to_json( iv_path = is_prefix-path
iv_name = is_prefix-name ).
ENDIF.
IF <root>-name IS INITIAL.
<root>-name = is_prefix-name.
ENDIF.
ls_next_prefix-path = is_prefix-path && is_prefix-name && '/'.
ASSIGN iv_data TO <tab>.
@ -1075,7 +1133,9 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
DATA lo_converter TYPE REF TO lcl_abap_to_json.
lo_type = cl_abap_typedescr=>describe_by_data( iv_data ).
CREATE OBJECT lo_converter.
lo_converter->mi_custom_mapping = ii_custom_mapping.
lo_converter->mv_keep_item_order = iv_keep_item_order.
lo_converter->insert_value_with_type(
@ -1125,6 +1185,15 @@ CLASS lcl_abap_to_json IMPLEMENTATION.
<n>-type = iv_type.
<n>-order = iv_item_order.
IF mi_custom_mapping IS BOUND.
<n>-name = mi_custom_mapping->to_json( iv_path = is_prefix-path
iv_name = is_prefix-name ).
ENDIF.
IF <n>-name IS INITIAL.
<n>-name = is_prefix-name.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -1468,8 +1468,6 @@ CLASS ltcl_writer_test DEFINITION FINAL
PRIVATE SECTION.
CLASS-DATA gv_sample TYPE string.
METHODS set_ajson FOR TESTING RAISING zcx_abapgit_ajson_error.
METHODS set_value FOR TESTING RAISING zcx_abapgit_ajson_error.
METHODS ignore_empty FOR TESTING RAISING zcx_abapgit_ajson_error.
@ -1907,7 +1905,6 @@ CLASS ltcl_writer_test IMPLEMENTATION.
METHOD arrays_negative.
DATA lo_cut TYPE REF TO zcl_abapgit_ajson.
DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
DATA li_writer TYPE REF TO zif_abapgit_ajson_writer.
lo_cut = zcl_abapgit_ajson=>create_empty( ).

View File

@ -0,0 +1,80 @@
CLASS zcl_abapgit_ajson_mapping DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS create_camel_case
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
iv_first_json_upper TYPE abap_bool DEFAULT abap_true
RETURNING
VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
CLASS-METHODS create_upper_case
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
RETURNING
VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
CLASS-METHODS create_lower_case
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields OPTIONAL
RETURNING
VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
CLASS-METHODS create_field_mapping
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields
RETURNING
VALUE(ri_mapping) TYPE REF TO zif_abapgit_ajson_mapping.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_abapgit_ajson_mapping IMPLEMENTATION.
METHOD create_camel_case.
CREATE OBJECT ri_mapping TYPE lcl_mapping_camel
EXPORTING
it_mapping_fields = it_mapping_fields
iv_first_json_upper = iv_first_json_upper.
ENDMETHOD.
METHOD create_upper_case.
CREATE OBJECT ri_mapping TYPE lcl_mapping_to_upper
EXPORTING
it_mapping_fields = it_mapping_fields.
ENDMETHOD.
METHOD create_lower_case.
CREATE OBJECT ri_mapping TYPE lcl_mapping_to_lower
EXPORTING
it_mapping_fields = it_mapping_fields.
ENDMETHOD.
METHOD create_field_mapping.
CREATE OBJECT ri_mapping TYPE lcl_mapping_fields
EXPORTING
it_mapping_fields = it_mapping_fields.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,71 @@
CLASS lcl_mapping_fields DEFINITION.
PUBLIC SECTION.
INTERFACES zif_abapgit_ajson_mapping.
ALIASES to_abap FOR zif_abapgit_ajson_mapping~to_abap.
ALIASES to_json FOR zif_abapgit_ajson_mapping~to_json.
METHODS constructor
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping~ty_mapping_fields OPTIONAL.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mt_mapping_fields TYPE zif_abapgit_ajson_mapping~ty_mapping_fields.
ENDCLASS.
CLASS lcl_mapping_to_upper DEFINITION.
PUBLIC SECTION.
INTERFACES zif_abapgit_ajson_mapping.
METHODS constructor
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping~ty_mapping_fields OPTIONAL.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mi_mapping_fields TYPE REF TO zif_abapgit_ajson_mapping.
ENDCLASS.
CLASS lcl_mapping_to_lower DEFINITION.
PUBLIC SECTION.
INTERFACES zif_abapgit_ajson_mapping.
METHODS constructor
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping~ty_mapping_fields OPTIONAL.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mi_mapping_fields TYPE REF TO zif_abapgit_ajson_mapping.
ENDCLASS.
CLASS lcl_mapping_camel DEFINITION.
PUBLIC SECTION.
INTERFACES zif_abapgit_ajson_mapping.
METHODS constructor
IMPORTING
it_mapping_fields TYPE zif_abapgit_ajson_mapping~ty_mapping_fields OPTIONAL
iv_first_json_upper TYPE abap_bool DEFAULT abap_true.
PROTECTED SECTION.
PRIVATE SECTION.
DATA mv_first_json_upper TYPE abap_bool.
DATA mi_mapping_fields TYPE REF TO zif_abapgit_ajson_mapping.
ENDCLASS.

View File

@ -0,0 +1,183 @@
CLASS lcl_mapping_fields IMPLEMENTATION.
METHOD constructor.
DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
LOOP AT it_mapping_fields INTO ls_mapping_field.
ls_mapping_field-abap = to_upper( ls_mapping_field-abap ).
INSERT ls_mapping_field INTO TABLE mt_mapping_fields.
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_abap.
DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
READ TABLE mt_mapping_fields INTO ls_mapping_field
WITH KEY json COMPONENTS json = iv_name.
IF sy-subrc = 0.
rv_result = ls_mapping_field-abap.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_json.
DATA lv_field TYPE string.
DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
lv_field = to_upper( iv_name ).
READ TABLE mt_mapping_fields INTO ls_mapping_field
WITH KEY abap COMPONENTS abap = lv_field.
IF sy-subrc = 0.
rv_result = ls_mapping_field-json.
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS lcl_mapping_to_upper IMPLEMENTATION.
METHOD constructor.
mi_mapping_fields = zcl_abapgit_ajson_mapping=>create_field_mapping( it_mapping_fields ).
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_abap.
rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
iv_name = iv_name ).
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_json.
rv_result = mi_mapping_fields->to_json( iv_path = iv_path
iv_name = iv_name ).
IF rv_result IS NOT INITIAL. " Mapping found
RETURN.
ENDIF.
rv_result = to_upper( iv_name ).
ENDMETHOD.
ENDCLASS.
CLASS lcl_mapping_to_lower IMPLEMENTATION.
METHOD constructor.
mi_mapping_fields = zcl_abapgit_ajson_mapping=>create_field_mapping( it_mapping_fields ).
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_abap.
rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
iv_name = iv_name ).
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_json.
rv_result = mi_mapping_fields->to_json( iv_path = iv_path
iv_name = iv_name ).
IF rv_result IS NOT INITIAL. " Mapping found
RETURN.
ENDIF.
rv_result = to_lower( iv_name ).
ENDMETHOD.
ENDCLASS.
CLASS lcl_mapping_camel IMPLEMENTATION.
METHOD constructor.
mi_mapping_fields = zcl_abapgit_ajson_mapping=>create_field_mapping( it_mapping_fields ).
mv_first_json_upper = iv_first_json_upper.
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_abap.
rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
iv_name = iv_name ).
IF rv_result IS NOT INITIAL. " Mapping found
RETURN.
ENDIF.
rv_result = iv_name.
REPLACE ALL OCCURRENCES OF REGEX `([a-z])([A-Z])` IN rv_result WITH `$1_$2`.
ENDMETHOD.
METHOD zif_abapgit_ajson_mapping~to_json.
TYPES ty_token TYPE c LENGTH 255.
DATA lt_tokens TYPE STANDARD TABLE OF ty_token.
DATA lv_from TYPE i.
FIELD-SYMBOLS <token> LIKE LINE OF lt_tokens.
rv_result = mi_mapping_fields->to_json( iv_path = iv_path
iv_name = iv_name ).
IF rv_result IS NOT INITIAL. " Mapping found
RETURN.
ENDIF.
rv_result = iv_name.
REPLACE ALL OCCURRENCES OF `__` IN rv_result WITH `*`.
TRANSLATE rv_result TO LOWER CASE.
TRANSLATE rv_result USING `/_:_~_`.
IF mv_first_json_upper = abap_true.
lv_from = 1.
ELSE.
lv_from = 2.
ENDIF.
SPLIT rv_result AT `_` INTO TABLE lt_tokens.
LOOP AT lt_tokens ASSIGNING <token> FROM lv_from.
TRANSLATE <token>(1) TO UPPER CASE.
ENDLOOP.
CONCATENATE LINES OF lt_tokens INTO rv_result.
REPLACE ALL OCCURRENCES OF `*` IN rv_result WITH `_`.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,269 @@
CLASS ltcl_camel_case DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
to_abap FOR TESTING RAISING zcx_abapgit_ajson_error,
to_json FOR TESTING RAISING zcx_abapgit_ajson_error,
to_json_first_lower FOR TESTING RAISING zcx_abapgit_ajson_error.
ENDCLASS.
CLASS ltcl_camel_case IMPLEMENTATION.
METHOD to_abap.
DATA:
lo_ajson TYPE REF TO zcl_abapgit_ajson,
li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
DATA:
BEGIN OF ls_result,
field_data TYPE string,
END OF ls_result.
li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( ).
lo_ajson = zcl_abapgit_ajson=>parse( iv_json = '{"FieldData":"field_value"}'
ii_custom_mapping = li_mapping ).
lo_ajson->to_abap( IMPORTING ev_container = ls_result ).
cl_abap_unit_assert=>assert_equals(
act = ls_result-field_data
exp = 'field_value' ).
ENDMETHOD.
METHOD to_json.
DATA:
lo_ajson TYPE REF TO zcl_abapgit_ajson,
li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
DATA:
BEGIN OF ls_result,
field_data TYPE string,
END OF ls_result.
li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ).
ls_result-field_data = 'field_value'.
lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( )
exp = '{"fieldData":"field_value"}' ).
ENDMETHOD.
METHOD to_json_first_lower.
DATA:
lo_ajson TYPE REF TO zcl_abapgit_ajson,
li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
DATA:
BEGIN OF ls_result,
field_data TYPE string,
END OF ls_result.
li_mapping = zcl_abapgit_ajson_mapping=>create_camel_case( ).
ls_result-field_data = 'field_value'.
lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( )
exp = '{"FieldData":"field_value"}' ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_fields DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
to_abap FOR TESTING RAISING zcx_abapgit_ajson_error,
to_json FOR TESTING RAISING zcx_abapgit_ajson_error.
ENDCLASS.
CLASS ltcl_fields IMPLEMENTATION.
METHOD to_abap.
DATA:
lo_ajson TYPE REF TO zcl_abapgit_ajson,
li_mapping TYPE REF TO zif_abapgit_ajson_mapping,
lt_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields,
ls_mapping_field LIKE LINE OF lt_mapping_fields.
DATA:
BEGIN OF ls_result,
abap_field TYPE string,
field TYPE string,
END OF ls_result.
CLEAR ls_mapping_field.
ls_mapping_field-abap = 'ABAP_FIELD'.
ls_mapping_field-json = 'json.field'.
INSERT ls_mapping_field INTO TABLE lt_mapping_fields.
li_mapping = zcl_abapgit_ajson_mapping=>create_field_mapping( lt_mapping_fields ).
lo_ajson =
zcl_abapgit_ajson=>parse( iv_json = '{"field":"value","json.field":"field_value"}'
ii_custom_mapping = li_mapping ).
lo_ajson->to_abap( IMPORTING ev_container = ls_result ).
cl_abap_unit_assert=>assert_equals(
act = ls_result-abap_field
exp = 'field_value' ).
cl_abap_unit_assert=>assert_equals(
act = ls_result-field
exp = 'value' ).
ENDMETHOD.
METHOD to_json.
DATA:
lo_ajson TYPE REF TO zcl_abapgit_ajson,
li_mapping TYPE REF TO zif_abapgit_ajson_mapping,
lt_mapping_fields TYPE zif_abapgit_ajson_mapping=>ty_mapping_fields,
ls_mapping_field LIKE LINE OF lt_mapping_fields.
DATA:
BEGIN OF ls_result,
abap_field TYPE string,
field TYPE string,
END OF ls_result.
CLEAR ls_mapping_field.
ls_mapping_field-abap = 'ABAP_FIELD'.
ls_mapping_field-json = 'json.field'.
INSERT ls_mapping_field INTO TABLE lt_mapping_fields.
li_mapping = zcl_abapgit_ajson_mapping=>create_field_mapping( lt_mapping_fields ).
ls_result-abap_field = 'field_value'.
ls_result-field = 'value'.
lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( )
exp = '{"field":"value","json.field":"field_value"}' ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_to_lower DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
to_json FOR TESTING RAISING zcx_abapgit_ajson_error.
ENDCLASS.
CLASS ltcl_to_lower IMPLEMENTATION.
METHOD to_json.
DATA:
lo_ajson TYPE REF TO zcl_abapgit_ajson,
li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
DATA:
BEGIN OF ls_result,
field_data TYPE string,
END OF ls_result.
li_mapping = zcl_abapgit_ajson_mapping=>create_lower_case( ).
ls_result-field_data = 'field_value'.
lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( )
exp = '{"field_data":"field_value"}' ).
ENDMETHOD.
ENDCLASS.
CLASS ltcl_to_upper DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
to_json FOR TESTING RAISING zcx_abapgit_ajson_error.
ENDCLASS.
CLASS ltcl_to_upper IMPLEMENTATION.
METHOD to_json.
DATA:
lo_ajson TYPE REF TO zcl_abapgit_ajson,
li_mapping TYPE REF TO zif_abapgit_ajson_mapping.
DATA:
BEGIN OF ls_result,
field_data TYPE string,
END OF ls_result.
li_mapping = zcl_abapgit_ajson_mapping=>create_upper_case( ).
ls_result-field_data = 'field_value'.
lo_ajson = zcl_abapgit_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( )
exp = '{"FIELD_DATA":"field_value"}' ).
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_AJSON_MAPPING</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>JSON Mapping</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>

View File

@ -0,0 +1,27 @@
INTERFACE zif_abapgit_ajson_mapping
PUBLIC.
TYPES:
BEGIN OF ty_mapping_field,
abap TYPE string,
json TYPE string,
END OF ty_mapping_field,
ty_mapping_fields TYPE STANDARD TABLE OF ty_mapping_field
WITH UNIQUE SORTED KEY abap COMPONENTS abap
WITH UNIQUE SORTED KEY json COMPONENTS json.
METHODS to_abap
IMPORTING
!iv_path TYPE string
!iv_name TYPE string
RETURNING
VALUE(rv_result) TYPE string.
METHODS to_json
IMPORTING
!iv_path TYPE string
!iv_name TYPE string
RETURNING
VALUE(rv_result) TYPE string.
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_AJSON_MAPPING</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>AJSON Mapping</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>