ajson, Automatic Update (#5260)

* [create-pull-request] automated change

* Update zcl_abapgit_ajson_utilities.clas.abap

* Update zcl_abapgit_ajson_utilities.clas.abap

* disable json_diff_arrays

Co-authored-by: larshp <larshp@users.noreply.github.com>
Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
github-actions[bot] 2022-01-10 09:07:53 +01:00 committed by GitHub
parent a586e5c9ed
commit 71dd50a1eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 151 additions and 50 deletions

View File

@ -10,6 +10,7 @@ CLASS zcl_abapgit_ajson_utilities DEFINITION
!iv_json_b TYPE string OPTIONAL !iv_json_b TYPE string OPTIONAL
!io_json_a TYPE REF TO zif_abapgit_ajson OPTIONAL !io_json_a TYPE REF TO zif_abapgit_ajson OPTIONAL
!io_json_b TYPE REF TO zif_abapgit_ajson OPTIONAL !io_json_b TYPE REF TO zif_abapgit_ajson OPTIONAL
!iv_keep_empty_arrays TYPE abap_bool DEFAULT abap_false
EXPORTING EXPORTING
!eo_insert TYPE REF TO zif_abapgit_ajson !eo_insert TYPE REF TO zif_abapgit_ajson
!eo_delete TYPE REF TO zif_abapgit_ajson !eo_delete TYPE REF TO zif_abapgit_ajson
@ -34,6 +35,14 @@ CLASS zcl_abapgit_ajson_utilities DEFINITION
DATA mo_delete TYPE REF TO zif_abapgit_ajson . DATA mo_delete TYPE REF TO zif_abapgit_ajson .
DATA mo_change TYPE REF TO zif_abapgit_ajson . DATA mo_change TYPE REF TO zif_abapgit_ajson .
METHODS normalize_input
IMPORTING
!iv_json TYPE string OPTIONAL
!io_json TYPE REF TO zif_abapgit_ajson OPTIONAL
RETURNING
VALUE(ro_json) TYPE REF TO zif_abapgit_ajson
RAISING
zcx_abapgit_ajson_error .
METHODS diff_a_b METHODS diff_a_b
IMPORTING IMPORTING
!iv_path TYPE string !iv_path TYPE string
@ -47,6 +56,7 @@ CLASS zcl_abapgit_ajson_utilities DEFINITION
METHODS delete_empty_nodes METHODS delete_empty_nodes
IMPORTING IMPORTING
!io_json TYPE REF TO zif_abapgit_ajson !io_json TYPE REF TO zif_abapgit_ajson
!iv_keep_empty_arrays TYPE abap_bool
RAISING RAISING
zcx_abapgit_ajson_error . zcx_abapgit_ajson_error .
ENDCLASS. ENDCLASS.
@ -59,16 +69,22 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION.
METHOD delete_empty_nodes. METHOD delete_empty_nodes.
DATA ls_json_tree LIKE LINE OF io_json->mt_json_tree. DATA ls_json_tree LIKE LINE OF io_json->mt_json_tree.
DATA lv_subrc TYPE sy-subrc. DATA lv_done TYPE abap_bool.
DO. DO.
lv_done = abap_true.
IF iv_keep_empty_arrays = abap_false.
LOOP AT io_json->mt_json_tree INTO ls_json_tree LOOP AT io_json->mt_json_tree INTO ls_json_tree
WHERE type = 'array' AND children = 0. WHERE type = 'array' AND children = 0.
io_json->delete( ls_json_tree-path && ls_json_tree-name ). io_json->delete( ls_json_tree-path && ls_json_tree-name ).
ENDLOOP. ENDLOOP.
lv_subrc = sy-subrc. IF sy-subrc = 0.
lv_done = abap_false.
ENDIF.
ENDIF.
LOOP AT io_json->mt_json_tree INTO ls_json_tree LOOP AT io_json->mt_json_tree INTO ls_json_tree
WHERE type = 'object' AND children = 0. WHERE type = 'object' AND children = 0.
@ -76,7 +92,11 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION.
io_json->delete( ls_json_tree-path && ls_json_tree-name ). io_json->delete( ls_json_tree-path && ls_json_tree-name ).
ENDLOOP. ENDLOOP.
IF lv_subrc = 4 AND sy-subrc = 4. IF sy-subrc = 0.
lv_done = abap_false.
ENDIF.
IF lv_done = abap_true.
EXIT. " nothing else to delete EXIT. " nothing else to delete
ENDIF. ENDIF.
ENDDO. ENDDO.
@ -86,28 +106,13 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION.
METHOD diff. METHOD diff.
IF boolc( iv_json_a IS SUPPLIED ) = boolc( io_json_a IS SUPPLIED ). mo_json_a = normalize_input(
zcx_abapgit_ajson_error=>raise( 'Either supply JSON string or instance, but not both' ). iv_json = iv_json_a
ENDIF. io_json = io_json_a ).
IF boolc( iv_json_b IS SUPPLIED ) = boolc( io_json_b IS SUPPLIED ).
zcx_abapgit_ajson_error=>raise( 'Either supply JSON string or instance, but not both' ).
ENDIF.
IF iv_json_a IS SUPPLIED. mo_json_b = normalize_input(
mo_json_a = zcl_abapgit_ajson=>parse( iv_json_a ). iv_json = iv_json_b
ELSEIF io_json_a IS BOUND. io_json = io_json_b ).
mo_json_a = io_json_a.
ELSE.
zcx_abapgit_ajson_error=>raise( 'Supply either JSON string or instance' ).
ENDIF.
IF iv_json_b IS SUPPLIED.
mo_json_b = zcl_abapgit_ajson=>parse( iv_json_b ).
ELSEIF io_json_a IS BOUND.
mo_json_b = io_json_b.
ELSE.
zcx_abapgit_ajson_error=>raise( 'Supply either JSON string or instance' ).
ENDIF.
mo_insert = zcl_abapgit_ajson=>create_empty( ). mo_insert = zcl_abapgit_ajson=>create_empty( ).
mo_delete = zcl_abapgit_ajson=>create_empty( ). mo_delete = zcl_abapgit_ajson=>create_empty( ).
@ -120,9 +125,15 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION.
eo_delete ?= mo_delete. eo_delete ?= mo_delete.
eo_change ?= mo_change. eo_change ?= mo_change.
delete_empty_nodes( eo_insert ). delete_empty_nodes(
delete_empty_nodes( eo_delete ). io_json = eo_insert
delete_empty_nodes( eo_change ). iv_keep_empty_arrays = iv_keep_empty_arrays ).
delete_empty_nodes(
io_json = eo_delete
iv_keep_empty_arrays = iv_keep_empty_arrays ).
delete_empty_nodes(
io_json = eo_change
iv_keep_empty_arrays = iv_keep_empty_arrays ).
ENDMETHOD. ENDMETHOD.
@ -243,21 +254,30 @@ CLASS zcl_abapgit_ajson_utilities IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD normalize_input.
IF boolc( iv_json IS INITIAL ) = boolc( io_json IS INITIAL ).
zcx_abapgit_ajson_error=>raise( 'Either supply JSON string or instance, but not both' ).
ENDIF.
IF iv_json IS NOT INITIAL.
ro_json = zcl_abapgit_ajson=>parse( iv_json ).
ELSEIF io_json IS NOT INITIAL.
ro_json = io_json.
ELSE.
zcx_abapgit_ajson_error=>raise( 'Supply either JSON string or instance' ).
ENDIF.
ENDMETHOD.
METHOD sort. METHOD sort.
DATA lo_json TYPE REF TO zif_abapgit_ajson. DATA lo_json TYPE REF TO zif_abapgit_ajson.
IF boolc( iv_json IS SUPPLIED ) = boolc( io_json IS SUPPLIED ). lo_json = normalize_input(
zcx_abapgit_ajson_error=>raise( 'Either supply JSON string or instance, but not both' ). iv_json = iv_json
ENDIF. io_json = io_json ).
IF iv_json IS SUPPLIED.
lo_json = zcl_abapgit_ajson=>parse( iv_json ).
ELSEIF io_json IS BOUND.
lo_json = io_json.
ELSE.
zcx_abapgit_ajson_error=>raise( 'Supply either JSON string or instance' ).
ENDIF.
" Nodes are parsed into a sorted table, so no explicit sorting required " Nodes are parsed into a sorted table, so no explicit sorting required
rv_sorted = lo_json->stringify( 2 ). rv_sorted = lo_json->stringify( 2 ).

View File

@ -128,6 +128,7 @@ CLASS ltcl_json_utils DEFINITION
METHODS json_diff FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS json_diff FOR TESTING RAISING zcx_abapgit_ajson_error.
METHODS json_diff_types FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS json_diff_types FOR TESTING RAISING zcx_abapgit_ajson_error.
METHODS json_diff_arrays FOR TESTING RAISING zcx_abapgit_ajson_error.
METHODS json_sort FOR TESTING RAISING zcx_abapgit_ajson_error. METHODS json_sort FOR TESTING RAISING zcx_abapgit_ajson_error.
ENDCLASS. ENDCLASS.
@ -330,6 +331,85 @@ CLASS ltcl_json_utils IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD json_diff_arrays.
DATA:
lv_json_a TYPE string,
lv_json_b TYPE string,
lo_util TYPE REF TO zcl_abapgit_ajson_utilities,
lo_insert TYPE REF TO zif_abapgit_ajson,
lo_delete TYPE REF TO zif_abapgit_ajson,
lo_change TYPE REF TO zif_abapgit_ajson,
lo_insert_exp TYPE REF TO lcl_nodes_helper.
" Add empty array
lv_json_a =
'{\n' &&
' "number": 123\n' &&
'}'.
lv_json_b =
'{\n' &&
' "names": [],\n' &&
' "number": 123\n' &&
'}'.
REPLACE ALL OCCURRENCES OF '\n' IN lv_json_a WITH cl_abap_char_utilities=>newline.
REPLACE ALL OCCURRENCES OF '\n' IN lv_json_b WITH cl_abap_char_utilities=>newline.
CREATE OBJECT lo_util.
" Empty arrays are ignored by default
lo_util->diff(
EXPORTING
iv_json_a = lv_json_a
iv_json_b = lv_json_b
IMPORTING
eo_insert = lo_insert
eo_delete = lo_delete
eo_change = lo_change ).
cl_abap_unit_assert=>assert_equals(
act = lines( lo_insert->mt_json_tree )
exp = 0 ).
cl_abap_unit_assert=>assert_equals(
act = lines( lo_delete->mt_json_tree )
exp = 0 ).
cl_abap_unit_assert=>assert_equals(
act = lines( lo_change->mt_json_tree )
exp = 0 ).
" Keep empty arrays
lo_util->diff(
EXPORTING
iv_json_a = lv_json_a
iv_json_b = lv_json_b
iv_keep_empty_arrays = abap_true
IMPORTING
eo_insert = lo_insert
eo_delete = lo_delete
eo_change = lo_change ).
CREATE OBJECT lo_insert_exp.
lo_insert_exp->add( ' | |object | |0|1' ).
lo_insert_exp->add( '/ |names |array | |0|0' ).
cl_abap_unit_assert=>assert_equals(
act = lo_insert->mt_json_tree
exp = lo_insert_exp->mt_nodes ).
cl_abap_unit_assert=>assert_equals(
act = lines( lo_delete->mt_json_tree )
exp = 0 ).
cl_abap_unit_assert=>assert_equals(
act = lines( lo_change->mt_json_tree )
exp = 0 ).
ENDMETHOD.
METHOD json_sort. METHOD json_sort.
DATA: DATA:

View File

@ -129,6 +129,7 @@
{"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_hashed_plain_tab"}, {"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_hashed_plain_tab"},
{"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_sorted_tab"}, {"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_sorted_tab"},
{"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_hashed_tab"}, {"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_hashed_tab"},
{"object": "ZCL_ABAPGIT_AJSON_UTILITIES", "class": "ltcl_json_utils", "method": "json_diff_arrays"},
{"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_w_plain_tab"}, {"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_w_plain_tab"},
{"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_w_tab_of_struc"}, {"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_w_tab_of_struc"},
{"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_array_of_arrays"}, {"object": "ZCL_ABAPGIT_AJSON", "class": "ltcl_json_to_abap", "method": "to_abap_array_of_arrays"},