update ajson mirror (#1379)

This commit is contained in:
oblomov-dev 2024-09-07 12:56:21 +02:00 committed by GitHub
parent 8d9efe5409
commit 860f03d05e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 2575 additions and 2087 deletions

43
.github/workflows/ajson_mirror.yaml vendored Normal file
View File

@ -0,0 +1,43 @@
name: ajson mirror
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 1'
permissions:
contents: read
jobs:
pr_ajson_changes:
# Origin repo only
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
if: github.repository == 'abap2UI5/abap2UI5'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- name: run
run: |
git clone https://github.com/abap2UI5/ajson_mirror.git
ls -l
rm src/01/00/01/z*
cp ajson_mirror/src/z* src/01/00/01/
rm -rf ajson_mirror
git status
- name: Open PR
uses: peter-evans/create-pull-request@v3
with:
title: ajson, Automatic Update
branch: automatic/ajson
body: |
Automatic update from mirror
https://github.com/abap2UI5/ajson_mirror
Make manual change to trigger CI
Note: manual changes might be overwritten when the branch updates, so keep changes small, and merge fast

File diff suppressed because it is too large Load Diff

View File

@ -74,7 +74,7 @@ CLASS lcl_utils DEFINITION FINAL.
RETURNING RETURNING
VALUE(rv_index) TYPE i VALUE(rv_index) TYPE i
RAISING RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
CLASS-METHODS string_to_xstring_utf8 CLASS-METHODS string_to_xstring_utf8
IMPORTING IMPORTING
iv_str TYPE string iv_str TYPE string
@ -137,7 +137,8 @@ CLASS lcl_utils IMPLEMENTATION.
IF rv_path+0(1) <> '/'. IF rv_path+0(1) <> '/'.
rv_path = '/' && rv_path. rv_path = '/' && rv_path.
ENDIF. ENDIF.
IF substring( val = rv_path off = strlen( rv_path ) - 1 ) <> '/'. IF substring( val = rv_path
off = strlen( rv_path ) - 1 ) <> '/'.
rv_path = rv_path && '/'. rv_path = rv_path && '/'.
ENDIF. ENDIF.
@ -154,18 +155,24 @@ CLASS lcl_utils IMPLEMENTATION.
RETURN. " empty path is the alias for root item = '' + '' RETURN. " empty path is the alias for root item = '' + ''
ENDIF. ENDIF.
IF substring( val = iv_path off = lv_len - 1 ) = '/'. IF substring( val = iv_path
off = lv_len - 1 ) = '/'.
lv_trim_slash = 1. " ignore last '/' lv_trim_slash = 1. " ignore last '/'
ENDIF. ENDIF.
lv_offs = find( val = reverse( iv_path ) sub = '/' off = lv_trim_slash ). lv_offs = find( val = reverse( iv_path )
sub = '/'
off = lv_trim_slash ).
IF lv_offs = -1. IF lv_offs = -1.
lv_offs = lv_len. " treat whole string as the 'name' part lv_offs = lv_len. " treat whole string as the 'name' part
ENDIF. ENDIF.
lv_offs = lv_len - lv_offs. lv_offs = lv_len - lv_offs.
rv_path_name-path = normalize_path( substring( val = iv_path len = lv_offs ) ). rv_path_name-path = normalize_path( substring( val = iv_path
rv_path_name-name = substring( val = iv_path off = lv_offs len = lv_len - lv_offs - lv_trim_slash ). len = lv_offs ) ).
rv_path_name-name = substring( val = iv_path
off = lv_offs
len = lv_len - lv_offs - lv_trim_slash ).
ENDMETHOD. ENDMETHOD.
@ -253,7 +260,7 @@ CLASS lcl_json_parser IMPLEMENTATION.
DATA lv_json TYPE string. DATA lv_json TYPE string.
DATA lv_offset TYPE i. DATA lv_offset TYPE i.
DATA lt_text TYPE STANDARD TABLE OF string. DATA lt_text TYPE TABLE OF string.
DATA lv_text TYPE string. DATA lv_text TYPE string.
DATA lv_line TYPE i. DATA lv_line TYPE i.
DATA lv_pos TYPE i. DATA lv_pos TYPE i.
@ -361,7 +368,8 @@ CLASS lcl_json_parser IMPLEMENTATION.
ENDIF. ENDIF.
" remove last path component " remove last path component
mv_stack_path = substring( val = mv_stack_path len = find( val = mv_stack_path sub = '/' occ = -2 ) + 1 ). mv_stack_path = substring( val = mv_stack_path
len = find( val = mv_stack_path sub = '/' occ = -2 ) + 1 ).
WHEN if_sxml_node=>co_nt_value. WHEN if_sxml_node=>co_nt_value.
DATA lo_value TYPE REF TO if_sxml_value_node. DATA lo_value TYPE REF TO if_sxml_value_node.
lo_value ?= lo_node. lo_value ?= lo_node.
@ -485,7 +493,8 @@ CLASS lcl_json_serializer IMPLEMENTATION.
DATA lv_indent_prefix TYPE string. DATA lv_indent_prefix TYPE string.
IF mv_indent_step > 0. IF mv_indent_step > 0.
lv_indent_prefix = repeat( val = ` ` occ = mv_indent_step * mv_level ). lv_indent_prefix = repeat( val = ` `
occ = mv_indent_step * mv_level ).
lv_item = lv_indent_prefix. lv_item = lv_indent_prefix.
ENDIF. ENDIF.
@ -887,6 +896,8 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
IF is_parent_type-tab_item_buf IS NOT BOUND. " Indirect hint that table was srt/hsh, see get_node_type IF is_parent_type-tab_item_buf IS NOT BOUND. " Indirect hint that table was srt/hsh, see get_node_type
APPEND INITIAL LINE TO <parent_stdtab> REFERENCE INTO lr_target_field. APPEND INITIAL LINE TO <parent_stdtab> REFERENCE INTO lr_target_field.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
ELSE.
CLEAR <tab_item>.
ENDIF. ENDIF.
WHEN lif_kind=>struct_flat OR lif_kind=>struct_deep. WHEN lif_kind=>struct_flat OR lif_kind=>struct_deep.
@ -1011,7 +1022,7 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
DATA lv_m TYPE c LENGTH 2. DATA lv_m TYPE c LENGTH 2.
DATA lv_d TYPE c LENGTH 2. DATA lv_d TYPE c LENGTH 2.
FIND FIRST OCCURRENCE OF REGEX '^(\d{4})-(\d{2})-(\d{2})(T|$)' "#EC NOTEXT FIND FIRST OCCURRENCE OF REGEX '^(\d{4})-(\d{2})-(\d{2})(T|$)'
IN iv_value IN iv_value
SUBMATCHES lv_y lv_m lv_d. SUBMATCHES lv_y lv_m lv_d.
IF sy-subrc <> 0. IF sy-subrc <> 0.
@ -1025,9 +1036,9 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
CONSTANTS lc_utc TYPE c LENGTH 6 VALUE 'UTC'. CONSTANTS lc_utc TYPE c LENGTH 6 VALUE 'UTC'.
CONSTANTS lc_regex_ts_with_hour TYPE string CONSTANTS lc_regex_ts_with_hour TYPE string
VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(\+)(\d{2}):(\d{2})`. "#EC NOTEXT VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(\+)(\d{2}):(\d{2})`.
CONSTANTS lc_regex_ts_utc TYPE string CONSTANTS lc_regex_ts_utc TYPE string
VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(Z|$)`. "#EC NOTEXT VALUE `^(\d{4})-(\d{2})-(\d{2})(T)(\d{2}):(\d{2}):(\d{2})(Z|$)`.
DATA: DATA:
BEGIN OF ls_timestamp, BEGIN OF ls_timestamp,
@ -1109,7 +1120,7 @@ CLASS lcl_json_to_abap IMPLEMENTATION.
DATA lv_m TYPE c LENGTH 2. DATA lv_m TYPE c LENGTH 2.
DATA lv_s TYPE c LENGTH 2. DATA lv_s TYPE c LENGTH 2.
FIND FIRST OCCURRENCE OF REGEX '^(\d{2}):(\d{2}):(\d{2})(T|$)' "#EC NOTEXT FIND FIRST OCCURRENCE OF REGEX '^(\d{2}):(\d{2}):(\d{2})(T|$)'
IN iv_value IN iv_value
SUBMATCHES lv_h lv_m lv_s. SUBMATCHES lv_h lv_m lv_s.
IF sy-subrc <> 0. IF sy-subrc <> 0.

View File

@ -822,13 +822,15 @@ CLASS ltcl_utils_test IMPLEMENTATION.
exp = 123 ). exp = 123 ).
TRY. TRY.
lcl_utils=>validate_array_index( iv_path = 'x' iv_index = 'a' ). lcl_utils=>validate_array_index( iv_path = 'x'
iv_index = 'a' ).
cl_abap_unit_assert=>fail( ). cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error. CATCH z2ui5_cx_ajson_error.
ENDTRY. ENDTRY.
TRY. TRY.
lcl_utils=>validate_array_index( iv_path = 'x' iv_index = '0' ). lcl_utils=>validate_array_index( iv_path = 'x'
iv_index = '0' ).
cl_abap_unit_assert=>fail( ). cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error. CATCH z2ui5_cx_ajson_error.
ENDTRY. ENDTRY.
@ -1407,6 +1409,7 @@ CLASS ltcl_json_to_abap DEFINITION
timestamp1 TYPE timestamp, timestamp1 TYPE timestamp,
timestamp2 TYPE timestamp, timestamp2 TYPE timestamp,
timestamp3 TYPE timestamp, timestamp3 TYPE timestamp,
timestamp4 TYPE timestampl,
END OF ty_complex. END OF ty_complex.
METHODS to_abap_struc METHODS to_abap_struc
@ -1442,6 +1445,9 @@ CLASS ltcl_json_to_abap DEFINITION
METHODS to_abap_hashed_plain_tab METHODS to_abap_hashed_plain_tab
FOR TESTING FOR TESTING
RAISING z2ui5_cx_ajson_error. RAISING z2ui5_cx_ajson_error.
METHODS to_abap_negative
FOR TESTING
RAISING z2ui5_cx_ajson_error.
METHODS to_abap_corresponding METHODS to_abap_corresponding
FOR TESTING FOR TESTING
RAISING z2ui5_cx_ajson_error. RAISING z2ui5_cx_ajson_error.
@ -1457,7 +1463,24 @@ CLASS ltcl_json_to_abap DEFINITION
METHODS to_abap_time METHODS to_abap_time
FOR TESTING FOR TESTING
RAISING cx_static_check. RAISING cx_static_check.
METHODS to_abap_str_to_packed
FOR TESTING
RAISING cx_static_check.
METHODS to_abap_compressed_stdrd
FOR TESTING
RAISING cx_static_check.
METHODS to_abap_compressed_stdrd_key
FOR TESTING
RAISING cx_static_check.
METHODS to_abap_compressed_sort
FOR TESTING
RAISING cx_static_check.
METHODS to_abap_compressed_sort_unique
FOR TESTING
RAISING cx_static_check.
METHODS to_abap_compressed_hash
FOR TESTING
RAISING cx_static_check.
ENDCLASS. ENDCLASS.
CLASS z2ui5_cl_ajson DEFINITION LOCAL FRIENDS ltcl_json_to_abap. CLASS z2ui5_cl_ajson DEFINITION LOCAL FRIENDS ltcl_json_to_abap.
@ -1487,6 +1510,7 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
lo_nodes->add( '/ |timestamp1 |str |2020-07-28T00:00:00 | ' ). lo_nodes->add( '/ |timestamp1 |str |2020-07-28T00:00:00 | ' ).
lo_nodes->add( '/ |timestamp2 |str |2020-07-28T00:00:00Z | ' ). lo_nodes->add( '/ |timestamp2 |str |2020-07-28T00:00:00Z | ' ).
lo_nodes->add( '/ |timestamp3 |str |2020-07-28T01:00:00+01:00 | ' ). lo_nodes->add( '/ |timestamp3 |str |2020-07-28T01:00:00+01:00 | ' ).
lo_nodes->add( '/ |timestamp4 |str |2020-07-28T01:00:00+01:00 | ' ).
CREATE OBJECT lo_cut. CREATE OBJECT lo_cut.
lo_cut->to_abap( lo_cut->to_abap(
@ -1505,6 +1529,7 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
ls_exp-timestamp1 = lv_exp_timestamp. ls_exp-timestamp1 = lv_exp_timestamp.
ls_exp-timestamp2 = lv_exp_timestamp. ls_exp-timestamp2 = lv_exp_timestamp.
ls_exp-timestamp3 = lv_exp_timestamp. ls_exp-timestamp3 = lv_exp_timestamp.
ls_exp-timestamp4 = lv_exp_timestamp.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = ls_mock act = ls_mock
@ -1554,21 +1579,43 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
act = lv_mock act = lv_mock
exp = '111111' ). exp = '111111' ).
* DATA lv_mock_init TYPE t. DATA lv_mock_init TYPE t.
*
* CREATE OBJECT lo_nodes. CREATE OBJECT lo_nodes.
* lo_nodes->add( ' | |str || ' ). lo_nodes->add( ' | |str || ' ).
*
* CREATE OBJECT lo_cut. CREATE OBJECT lo_cut.
* lo_cut->to_abap( lo_cut->to_abap(
* EXPORTING EXPORTING
* it_nodes = lo_nodes->sorted( ) it_nodes = lo_nodes->sorted( )
* CHANGING CHANGING
* c_container = lv_mock_init ). c_container = lv_mock_init ).
*
* cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
* act = lv_mock_init act = lv_mock_init
* exp = '000000' ). exp = '000000' ).
ENDMETHOD.
METHOD to_abap_str_to_packed.
DATA lo_cut TYPE REF TO lcl_json_to_abap.
DATA lv_act TYPE p LENGTH 10 DECIMALS 3.
DATA lo_nodes TYPE REF TO lcl_nodes_helper.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |str |1.3333 | ' ).
CREATE OBJECT lo_cut.
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = lv_act ).
cl_abap_unit_assert=>assert_equals(
act = lv_act
exp = '1.333' ).
ENDMETHOD. ENDMETHOD.
@ -1625,8 +1672,8 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
METHOD to_abap_array_of_arrays_simple. METHOD to_abap_array_of_arrays_simple.
DATA lo_cut TYPE REF TO lcl_json_to_abap. DATA lo_cut TYPE REF TO lcl_json_to_abap.
DATA lt_mock TYPE STANDARD TABLE OF string_table. DATA lt_mock TYPE TABLE OF string_table.
DATA lt_exp TYPE STANDARD TABLE OF string_table. DATA lt_exp TYPE TABLE OF string_table.
DATA lt_tmp TYPE string_table. DATA lt_tmp TYPE string_table.
DATA lo_nodes TYPE REF TO lcl_nodes_helper. DATA lo_nodes TYPE REF TO lcl_nodes_helper.
@ -1659,8 +1706,8 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
METHOD to_abap_array_of_arrays. METHOD to_abap_array_of_arrays.
DATA lo_cut TYPE REF TO lcl_json_to_abap. DATA lo_cut TYPE REF TO lcl_json_to_abap.
DATA lt_mock TYPE STANDARD TABLE OF string_table. DATA lt_mock TYPE TABLE OF string_table.
DATA lt_exp TYPE STANDARD TABLE OF string_table. DATA lt_exp TYPE TABLE OF string_table.
DATA lt_tmp TYPE string_table. DATA lt_tmp TYPE string_table.
DATA lo_nodes TYPE REF TO lcl_nodes_helper. DATA lo_nodes TYPE REF TO lcl_nodes_helper.
@ -1859,6 +1906,173 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD to_abap_negative.
DATA lo_cut TYPE REF TO lcl_json_to_abap.
DATA lx TYPE REF TO z2ui5_cx_ajson_error.
DATA ls_mock TYPE ty_complex.
CREATE OBJECT lo_cut.
DATA lo_nodes TYPE REF TO lcl_nodes_helper.
TRY.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |object | ' ).
lo_nodes->add( '/ |str |object | ' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = ls_mock ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Expected structure' ).
ENDTRY.
TRY.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |object | ' ).
lo_nodes->add( '/ |str |array | ' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = ls_mock ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Expected table' ).
ENDTRY.
TRY.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |object | ' ).
lo_nodes->add( '/ |int |str |hello ' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = ls_mock ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Source is not a number' ).
ENDTRY.
TRY.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |object | ' ).
lo_nodes->add( '/ |date1 |str |baddate ' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = ls_mock ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Unexpected date format' ).
ENDTRY.
TRY.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |object | ' ).
lo_nodes->add( '/ |missing |str |123 ' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = ls_mock ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Path not found' ).
ENDTRY.
TRY.
DATA lt_str TYPE string_table.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |array | | ' ).
lo_nodes->add( '/ |a |str |hello |1' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = lt_str ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Need index to access tables' ).
ENDTRY.
TRY.
DATA lr_obj TYPE REF TO object.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |str |hello | ' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = lr_obj ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Cannot assign to ref' ).
ENDTRY.
TRY.
DATA lr_data TYPE REF TO data.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |str |hello | ' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = lr_data ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Cannot assign to ref' ).
ENDTRY.
TRY.
DATA lt_hashed TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
CREATE OBJECT lo_nodes.
lo_nodes->add( ' | |array | | ' ).
lo_nodes->add( '/ |1 |str |One |1' ).
lo_nodes->add( '/ |2 |str |One |2' ).
lo_cut->to_abap(
EXPORTING
it_nodes = lo_nodes->sorted( )
CHANGING
c_container = lt_hashed ).
cl_abap_unit_assert=>fail( ).
CATCH z2ui5_cx_ajson_error INTO lx.
cl_abap_unit_assert=>assert_equals(
act = lx->message
exp = 'Duplicate insertion' ).
ENDTRY.
ENDMETHOD.
METHOD to_abap_corresponding. METHOD to_abap_corresponding.
@ -1990,6 +2204,171 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD to_abap_compressed_stdrd.
TYPES: BEGIN OF ty_foo_bar,
foo TYPE string,
bar TYPE string,
END OF ty_foo_bar.
DATA lt_foo_bar TYPE STANDARD TABLE OF ty_foo_bar.
DATA ls_foo_bar LIKE LINE OF lt_foo_bar.
DATA lo_ajson TYPE REF TO z2ui5_cl_ajson.
DATA lv_json TYPE string.
lv_json =
'[' &&
' {' &&
' "foo": "abc",' &&
' "bar": "123"' &&
' },' &&
' {' &&
' "foo": "cde"' &&
' }' &&
']'.
lo_ajson = z2ui5_cl_ajson=>parse( lv_json ).
lo_ajson->to_abap( IMPORTING ev_container = lt_foo_bar ).
READ TABLE lt_foo_bar WITH KEY foo = 'cde' INTO ls_foo_bar.
cl_abap_unit_assert=>assert_initial( act = ls_foo_bar-bar ).
ENDMETHOD.
METHOD to_abap_compressed_stdrd_key.
TYPES: BEGIN OF ty_foo_bar,
foo TYPE string,
bar TYPE string,
END OF ty_foo_bar.
DATA lt_foo_bar TYPE STANDARD TABLE OF ty_foo_bar WITH NON-UNIQUE KEY foo.
DATA ls_foo_bar LIKE LINE OF lt_foo_bar.
DATA lo_ajson TYPE REF TO z2ui5_cl_ajson.
DATA lv_json TYPE string.
lv_json =
'[' &&
' {' &&
' "foo": "abc",' &&
' "bar": "123"' &&
' },' &&
' {' &&
' "foo": "cde"' &&
' }' &&
']'.
lo_ajson = z2ui5_cl_ajson=>parse( lv_json ).
lo_ajson->to_abap( IMPORTING ev_container = lt_foo_bar ).
READ TABLE lt_foo_bar WITH KEY foo = 'cde' INTO ls_foo_bar.
cl_abap_unit_assert=>assert_initial( act = ls_foo_bar-bar ).
ENDMETHOD.
METHOD to_abap_compressed_sort.
TYPES: BEGIN OF ty_foo_bar,
foo TYPE string,
bar TYPE string,
END OF ty_foo_bar.
DATA lt_foo_bar TYPE SORTED TABLE OF ty_foo_bar WITH NON-UNIQUE KEY foo.
DATA ls_foo_bar LIKE LINE OF lt_foo_bar.
DATA lo_ajson TYPE REF TO z2ui5_cl_ajson.
DATA lv_json TYPE string.
lv_json =
'[' &&
' {' &&
' "foo": "abc",' &&
' "bar": "123"' &&
' },' &&
' {' &&
' "foo": "cde"' &&
' }' &&
']'.
lo_ajson = z2ui5_cl_ajson=>parse( lv_json ).
lo_ajson->to_abap( IMPORTING ev_container = lt_foo_bar ).
READ TABLE lt_foo_bar WITH KEY foo = 'cde' INTO ls_foo_bar.
cl_abap_unit_assert=>assert_initial( act = ls_foo_bar-bar ).
ENDMETHOD.
METHOD to_abap_compressed_sort_unique.
TYPES: BEGIN OF ty_foo_bar,
foo TYPE string,
bar TYPE string,
END OF ty_foo_bar.
DATA lt_foo_bar TYPE SORTED TABLE OF ty_foo_bar WITH UNIQUE KEY foo.
DATA ls_foo_bar LIKE LINE OF lt_foo_bar.
DATA lo_ajson TYPE REF TO z2ui5_cl_ajson.
DATA lv_json TYPE string.
lv_json =
'[' &&
' {' &&
' "foo": "abc",' &&
' "bar": "123"' &&
' },' &&
' {' &&
' "foo": "cde"' &&
' }' &&
']'.
lo_ajson = z2ui5_cl_ajson=>parse( lv_json ).
lo_ajson->to_abap( IMPORTING ev_container = lt_foo_bar ).
READ TABLE lt_foo_bar WITH KEY foo = 'cde' INTO ls_foo_bar.
cl_abap_unit_assert=>assert_initial( act = ls_foo_bar-bar ).
ENDMETHOD.
METHOD to_abap_compressed_hash.
TYPES: BEGIN OF ty_foo_bar,
foo TYPE string,
bar TYPE string,
END OF ty_foo_bar.
DATA lt_foo_bar TYPE HASHED TABLE OF ty_foo_bar WITH UNIQUE KEY foo.
DATA ls_foo_bar LIKE LINE OF lt_foo_bar.
DATA lo_ajson TYPE REF TO z2ui5_cl_ajson.
DATA lv_json TYPE string.
lv_json =
'[' &&
' {' &&
' "foo": "abc",' &&
' "bar": "123"' &&
' },' &&
' {' &&
' "foo": "cde"' &&
' }' &&
']'.
lo_ajson = z2ui5_cl_ajson=>parse( lv_json ).
lo_ajson->to_abap( IMPORTING ev_container = lt_foo_bar ).
READ TABLE lt_foo_bar WITH KEY foo = 'cde' INTO ls_foo_bar.
cl_abap_unit_assert=>assert_initial( act = ls_foo_bar-bar ).
ENDMETHOD.
ENDCLASS. ENDCLASS.
********************************************************************** **********************************************************************
@ -2027,6 +2406,7 @@ CLASS ltcl_writer_test DEFINITION FINAL
METHODS read_only FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS read_only FOR TESTING RAISING z2ui5_cx_ajson_error.
METHODS set_array_obj FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS set_array_obj FOR TESTING RAISING z2ui5_cx_ajson_error.
METHODS set_with_type FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS set_with_type FOR TESTING RAISING z2ui5_cx_ajson_error.
METHODS new_array_w_keep_order_touch FOR TESTING RAISING z2ui5_cx_ajson_error.
METHODS overwrite_w_keep_order_touch FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS overwrite_w_keep_order_touch FOR TESTING RAISING z2ui5_cx_ajson_error.
METHODS overwrite_w_keep_order_set FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS overwrite_w_keep_order_set FOR TESTING RAISING z2ui5_cx_ajson_error.
METHODS setx FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS setx FOR TESTING RAISING z2ui5_cx_ajson_error.
@ -3100,6 +3480,37 @@ CLASS ltcl_writer_test IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD new_array_w_keep_order_touch.
DATA li_cut TYPE REF TO z2ui5_if_ajson.
" default order adds new arrays at beginning of node (pos 0)
li_cut = z2ui5_cl_ajson=>create_empty(
)->set(
iv_path = '/b'
iv_val = 1 ).
li_cut->touch_array( '/a' ).
cl_abap_unit_assert=>assert_equals(
act = li_cut->stringify( )
exp = '{"a":[],"b":1}' ).
" with keep order, new array is created at end of node
li_cut = z2ui5_cl_ajson=>create_empty(
)->keep_item_order(
)->set(
iv_path = '/b'
iv_val = 1 ).
li_cut->touch_array( '/a' ).
cl_abap_unit_assert=>assert_equals(
act = li_cut->stringify( )
exp = '{"b":1,"a":[]}' ).
ENDMETHOD.
METHOD overwrite_w_keep_order_touch. METHOD overwrite_w_keep_order_touch.
DATA li_cut TYPE REF TO z2ui5_if_ajson. DATA li_cut TYPE REF TO z2ui5_if_ajson.
@ -3374,8 +3785,8 @@ CLASS ltcl_integrated IMPLEMENTATION.
METHOD array_index. METHOD array_index.
DATA lt_act TYPE STANDARD TABLE OF ty_loc. DATA lt_act TYPE TABLE OF ty_loc.
DATA lt_exp TYPE STANDARD TABLE OF ty_loc. DATA lt_exp TYPE TABLE OF ty_loc.
DATA ls_exp TYPE ty_loc. DATA ls_exp TYPE ty_loc.
DATA lv_src TYPE string. DATA lv_src TYPE string.
@ -4027,7 +4438,7 @@ CLASS ltcl_abap_to_json IMPLEMENTATION.
DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper. DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
DATA lt_nodes TYPE z2ui5_if_ajson_types=>ty_nodes_tt. DATA lt_nodes TYPE z2ui5_if_ajson_types=>ty_nodes_tt.
DATA lt_tab TYPE STANDARD TABLE OF ty_struc. DATA lt_tab TYPE TABLE OF ty_struc.
FIELD-SYMBOLS <s> LIKE LINE OF lt_tab. FIELD-SYMBOLS <s> LIKE LINE OF lt_tab.
APPEND INITIAL LINE TO lt_tab ASSIGNING <s>. APPEND INITIAL LINE TO lt_tab ASSIGNING <s>.
@ -4095,7 +4506,7 @@ CLASS ltcl_filter_test DEFINITION FINAL
type TYPE z2ui5_if_ajson_filter=>ty_visit_type, type TYPE z2ui5_if_ajson_filter=>ty_visit_type,
END OF ty_visit_history. END OF ty_visit_history.
DATA mt_visit_history TYPE STANDARD TABLE OF ty_visit_history. DATA mt_visit_history TYPE TABLE OF ty_visit_history.
METHODS simple_test FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS simple_test FOR TESTING RAISING z2ui5_cx_ajson_error.
METHODS array_test FOR TESTING RAISING z2ui5_cx_ajson_error. METHODS array_test FOR TESTING RAISING z2ui5_cx_ajson_error.

View File

@ -1,58 +1,58 @@
class Z2UI5_CL_AJSON_FILTER_LIB definition CLASS z2ui5_cl_ajson_filter_lib DEFINITION
public PUBLIC
final FINAL
create public . CREATE PUBLIC .
public section. PUBLIC SECTION.
class-methods create_empty_filter CLASS-METHODS create_empty_filter
returning RETURNING
value(ri_filter) type ref to z2ui5_if_ajson_filter VALUE(ri_filter) TYPE REF TO z2ui5_if_ajson_filter
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
class-methods create_path_filter CLASS-METHODS create_path_filter
importing IMPORTING
!it_skip_paths type string_table optional !it_skip_paths TYPE string_table OPTIONAL
!iv_skip_paths type string optional !iv_skip_paths TYPE string OPTIONAL
!iv_pattern_search type abap_bool default abap_false !iv_pattern_search TYPE abap_bool DEFAULT abap_false
returning RETURNING
value(ri_filter) type ref to z2ui5_if_ajson_filter VALUE(ri_filter) TYPE REF TO z2ui5_if_ajson_filter
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
class-methods create_and_filter CLASS-METHODS create_and_filter
importing IMPORTING
!it_filters type z2ui5_if_ajson_filter=>ty_filter_tab !it_filters TYPE z2ui5_if_ajson_filter=>ty_filter_tab
returning RETURNING
value(ri_filter) type ref to z2ui5_if_ajson_filter VALUE(ri_filter) TYPE REF TO z2ui5_if_ajson_filter
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
ENDCLASS. ENDCLASS.
CLASS Z2UI5_CL_AJSON_FILTER_LIB IMPLEMENTATION. CLASS z2ui5_cl_ajson_filter_lib IMPLEMENTATION.
method create_and_filter. METHOD create_and_filter.
create object ri_filter type lcl_and_filter CREATE OBJECT ri_filter TYPE lcl_and_filter
exporting EXPORTING
it_filters = it_filters. it_filters = it_filters.
endmethod. ENDMETHOD.
method create_empty_filter. METHOD create_empty_filter.
create object ri_filter type lcl_empty_filter. CREATE OBJECT ri_filter TYPE lcl_empty_filter.
endmethod. ENDMETHOD.
method create_path_filter. METHOD create_path_filter.
create object ri_filter type lcl_paths_filter CREATE OBJECT ri_filter TYPE lcl_paths_filter
exporting EXPORTING
iv_pattern_search = iv_pattern_search iv_pattern_search = iv_pattern_search
it_skip_paths = it_skip_paths it_skip_paths = it_skip_paths
iv_skip_paths = iv_skip_paths. iv_skip_paths = iv_skip_paths.
endmethod. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -2,143 +2,143 @@
* FILTER EMPTY VALUES * FILTER EMPTY VALUES
********************************************************************** **********************************************************************
class lcl_empty_filter definition final. CLASS lcl_empty_filter DEFINITION FINAL.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_filter. INTERFACES z2ui5_if_ajson_filter.
endclass. ENDCLASS.
class lcl_empty_filter implementation. CLASS lcl_empty_filter IMPLEMENTATION.
method z2ui5_if_ajson_filter~keep_node. METHOD z2ui5_if_ajson_filter~keep_node.
rv_keep = boolc( rv_keep = boolc(
( iv_visit = z2ui5_if_ajson_filter=>visit_type-value and is_node-value is not initial ) or ( iv_visit = z2ui5_if_ajson_filter=>visit_type-value AND is_node-value IS NOT INITIAL ) OR
( iv_visit <> z2ui5_if_ajson_filter=>visit_type-value and is_node-children > 0 ) ). ( iv_visit <> z2ui5_if_ajson_filter=>visit_type-value AND is_node-children > 0 ) ).
" children = 0 on open for initially empty nodes and on close for filtered ones " children = 0 on open for initially empty nodes and on close for filtered ones
endmethod. ENDMETHOD.
endclass. ENDCLASS.
********************************************************************** **********************************************************************
* FILTER PREDEFINED PATHS * FILTER PREDEFINED PATHS
********************************************************************** **********************************************************************
class lcl_paths_filter definition final. CLASS lcl_paths_filter DEFINITION FINAL.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_filter. INTERFACES z2ui5_if_ajson_filter.
methods constructor METHODS constructor
importing IMPORTING
it_skip_paths type string_table optional it_skip_paths TYPE string_table OPTIONAL
iv_skip_paths type string optional iv_skip_paths TYPE string OPTIONAL
iv_pattern_search type abap_bool iv_pattern_search TYPE abap_bool
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
private section. PRIVATE SECTION.
data mt_skip_paths type hashed table of string with unique key table_line. DATA mt_skip_paths TYPE HASHED TABLE OF string WITH UNIQUE KEY table_line.
data mv_pattern_search type abap_bool. DATA mv_pattern_search TYPE abap_bool.
endclass. ENDCLASS.
class lcl_paths_filter implementation. CLASS lcl_paths_filter IMPLEMENTATION.
method z2ui5_if_ajson_filter~keep_node. METHOD z2ui5_if_ajson_filter~keep_node.
data lv_full_path type string. DATA lv_full_path TYPE string.
field-symbols <p> like line of mt_skip_paths. FIELD-SYMBOLS <p> LIKE LINE OF mt_skip_paths.
lv_full_path = is_node-path && is_node-name. lv_full_path = is_node-path && is_node-name.
if mv_pattern_search = abap_true. IF mv_pattern_search = abap_true.
rv_keep = abap_true. rv_keep = abap_true.
loop at mt_skip_paths assigning <p>. LOOP AT mt_skip_paths ASSIGNING <p>.
if lv_full_path cp <p>. IF lv_full_path CP <p>.
rv_keep = abap_false. rv_keep = abap_false.
exit. EXIT.
endif. ENDIF.
endloop. ENDLOOP.
else. ELSE.
read table mt_skip_paths with key table_line = lv_full_path transporting no fields. READ TABLE mt_skip_paths WITH KEY table_line = lv_full_path TRANSPORTING NO FIELDS.
rv_keep = boolc( sy-subrc <> 0 ). rv_keep = boolc( sy-subrc <> 0 ).
endif. ENDIF.
endmethod. ENDMETHOD.
method constructor. METHOD constructor.
data lv_s type string. DATA lv_s TYPE string.
data lt_tab type string_table. DATA lt_tab TYPE string_table.
field-symbols <s> type string. FIELD-SYMBOLS <s> TYPE string.
if boolc( iv_skip_paths is initial ) = boolc( it_skip_paths is initial ). " XOR IF boolc( iv_skip_paths IS INITIAL ) = boolc( it_skip_paths IS INITIAL ). " XOR
z2UI5_cx_ajson_error=>raise( 'no filter path specified' ). z2ui5_cx_ajson_error=>raise( 'no filter path specified' ).
endif. ENDIF.
loop at it_skip_paths into lv_s. LOOP AT it_skip_paths INTO lv_s.
lv_s = to_lower( lv_s ). lv_s = to_lower( lv_s ).
append lv_s to lt_tab. APPEND lv_s TO lt_tab.
endloop. ENDLOOP.
if iv_skip_paths is not initial. IF iv_skip_paths IS NOT INITIAL.
split iv_skip_paths at ',' into table lt_tab. SPLIT iv_skip_paths AT ',' INTO TABLE lt_tab.
loop at lt_tab assigning <s>. LOOP AT lt_tab ASSIGNING <s>.
if <s> is initial. IF <s> IS INITIAL.
delete lt_tab index sy-tabix. DELETE lt_tab INDEX sy-tabix.
continue. CONTINUE.
endif. ENDIF.
<s> = condense( to_lower( <s> ) ). <s> = condense( to_lower( <s> ) ).
endloop. ENDLOOP.
endif. ENDIF.
sort lt_tab by table_line. SORT lt_tab BY table_line.
delete adjacent duplicates from lt_tab. DELETE ADJACENT DUPLICATES FROM lt_tab.
mt_skip_paths = lt_tab. mt_skip_paths = lt_tab.
mv_pattern_search = iv_pattern_search. mv_pattern_search = iv_pattern_search.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
********************************************************************** **********************************************************************
* MULTI FILTER * MULTI FILTER
********************************************************************** **********************************************************************
class lcl_and_filter definition final. CLASS lcl_and_filter DEFINITION FINAL.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_filter. INTERFACES z2ui5_if_ajson_filter.
methods constructor METHODS constructor
importing IMPORTING
it_filters type z2ui5_if_ajson_filter=>ty_filter_tab it_filters TYPE z2ui5_if_ajson_filter=>ty_filter_tab
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
private section. PRIVATE SECTION.
data mt_filters type z2ui5_if_ajson_filter=>ty_filter_tab. DATA mt_filters TYPE z2ui5_if_ajson_filter=>ty_filter_tab.
endclass. ENDCLASS.
class lcl_and_filter implementation. CLASS lcl_and_filter IMPLEMENTATION.
method z2ui5_if_ajson_filter~keep_node. METHOD z2ui5_if_ajson_filter~keep_node.
data li_filter like line of mt_filters. DATA li_filter LIKE LINE OF mt_filters.
rv_keep = abap_true. rv_keep = abap_true.
loop at mt_filters into li_filter. LOOP AT mt_filters INTO li_filter.
rv_keep = li_filter->keep_node( rv_keep = li_filter->keep_node(
is_node = is_node is_node = is_node
iv_visit = iv_visit ). iv_visit = iv_visit ).
if rv_keep = abap_false. IF rv_keep = abap_false.
return. RETURN.
endif. ENDIF.
endloop. ENDLOOP.
endmethod. ENDMETHOD.
method constructor. METHOD constructor.
data li_filter like line of it_filters. DATA li_filter LIKE LINE OF it_filters.
loop at it_filters into li_filter where table_line is bound. LOOP AT it_filters INTO li_filter WHERE table_line IS BOUND.
append li_filter to mt_filters. APPEND li_filter TO mt_filters.
endloop. ENDLOOP.
endmethod. ENDMETHOD.
endclass. ENDCLASS.

View File

@ -1,24 +1,24 @@
class ltcl_filters_test definition final CLASS ltcl_filters_test DEFINITION FINAL
for testing FOR TESTING
risk level harmless RISK LEVEL HARMLESS
duration short. DURATION SHORT.
private section. PRIVATE SECTION.
methods empty_filter_simple for testing raising z2UI5_cx_ajson_error. METHODS empty_filter_simple FOR TESTING RAISING z2ui5_cx_ajson_error.
methods empty_filter_deep for testing raising z2UI5_cx_ajson_error. METHODS empty_filter_deep FOR TESTING RAISING z2ui5_cx_ajson_error.
methods path_filter for testing raising z2UI5_cx_ajson_error. METHODS path_filter FOR TESTING RAISING z2ui5_cx_ajson_error.
methods path_filter_string for testing raising z2UI5_cx_ajson_error. METHODS path_filter_string FOR TESTING RAISING z2ui5_cx_ajson_error.
methods path_filter_w_patterns for testing raising z2UI5_cx_ajson_error. METHODS path_filter_w_patterns FOR TESTING RAISING z2ui5_cx_ajson_error.
methods path_filter_deep for testing raising z2UI5_cx_ajson_error. METHODS path_filter_deep FOR TESTING RAISING z2ui5_cx_ajson_error.
methods and_filter for testing raising z2UI5_cx_ajson_error. METHODS and_filter FOR TESTING RAISING z2ui5_cx_ajson_error.
endclass. ENDCLASS.
class ltcl_filters_test implementation. CLASS ltcl_filters_test IMPLEMENTATION.
method empty_filter_simple. METHOD empty_filter_simple.
data li_json type ref to z2ui5_if_ajson. DATA li_json TYPE REF TO z2ui5_if_ajson.
data li_json_filtered type ref to z2ui5_if_ajson. DATA li_json_filtered TYPE REF TO z2ui5_if_ajson.
li_json = z2ui5_cl_ajson=>create_empty( ). li_json = z2ui5_cl_ajson=>create_empty( ).
li_json->set( li_json->set(
@ -42,12 +42,12 @@ class ltcl_filters_test implementation.
act = li_json_filtered->stringify( ) act = li_json_filtered->stringify( )
exp = '{"a":"1","c":"3"}' ). exp = '{"a":"1","c":"3"}' ).
endmethod. ENDMETHOD.
method empty_filter_deep. METHOD empty_filter_deep.
data li_json type ref to z2ui5_if_ajson. DATA li_json TYPE REF TO z2ui5_if_ajson.
data li_json_filtered type ref to z2ui5_if_ajson. DATA li_json_filtered TYPE REF TO z2ui5_if_ajson.
li_json = z2ui5_cl_ajson=>create_empty( ). li_json = z2ui5_cl_ajson=>create_empty( ).
li_json->set( li_json->set(
@ -71,15 +71,15 @@ class ltcl_filters_test implementation.
act = li_json_filtered->stringify( ) act = li_json_filtered->stringify( )
exp = '{"a":"1"}' ). exp = '{"a":"1"}' ).
endmethod. ENDMETHOD.
method path_filter. METHOD path_filter.
data li_json type ref to z2ui5_if_ajson. DATA li_json TYPE REF TO z2ui5_if_ajson.
data li_json_filtered type ref to z2ui5_if_ajson. DATA li_json_filtered TYPE REF TO z2ui5_if_ajson.
data lt_paths type string_table. DATA lt_paths TYPE string_table.
append '/b/c' to lt_paths. APPEND '/b/c' TO lt_paths.
li_json = z2ui5_cl_ajson=>create_empty( ). li_json = z2ui5_cl_ajson=>create_empty( ).
li_json->set( li_json->set(
@ -100,12 +100,12 @@ class ltcl_filters_test implementation.
act = li_json_filtered->stringify( ) act = li_json_filtered->stringify( )
exp = '{"a":"1","b":{},"c":{"d":"3"}}' ). exp = '{"a":"1","b":{},"c":{"d":"3"}}' ).
endmethod. ENDMETHOD.
method path_filter_string. METHOD path_filter_string.
data li_json type ref to z2ui5_if_ajson. DATA li_json TYPE REF TO z2ui5_if_ajson.
data li_json_filtered type ref to z2ui5_if_ajson. DATA li_json_filtered TYPE REF TO z2ui5_if_ajson.
li_json = z2ui5_cl_ajson=>create_empty( ). li_json = z2ui5_cl_ajson=>create_empty( ).
li_json->set( li_json->set(
@ -126,12 +126,12 @@ class ltcl_filters_test implementation.
act = li_json_filtered->stringify( ) act = li_json_filtered->stringify( )
exp = '{"a":"1","b":{},"c":{}}' ). exp = '{"a":"1","b":{},"c":{}}' ).
endmethod. ENDMETHOD.
method path_filter_w_patterns. METHOD path_filter_w_patterns.
data li_json type ref to z2ui5_if_ajson. DATA li_json TYPE REF TO z2ui5_if_ajson.
data li_json_filtered type ref to z2ui5_if_ajson. DATA li_json_filtered TYPE REF TO z2ui5_if_ajson.
li_json = z2ui5_cl_ajson=>create_empty( ). li_json = z2ui5_cl_ajson=>create_empty( ).
li_json->set( li_json->set(
@ -160,15 +160,15 @@ class ltcl_filters_test implementation.
act = li_json_filtered->stringify( ) act = li_json_filtered->stringify( )
exp = '{"a":"1","b":{},"c":{"d":"3"}}' ). exp = '{"a":"1","b":{},"c":{"d":"3"}}' ).
endmethod. ENDMETHOD.
method path_filter_deep. METHOD path_filter_deep.
data li_json type ref to z2ui5_if_ajson. DATA li_json TYPE REF TO z2ui5_if_ajson.
data li_json_filtered type ref to z2ui5_if_ajson. DATA li_json_filtered TYPE REF TO z2ui5_if_ajson.
data lt_paths type string_table. DATA lt_paths TYPE string_table.
append '/b' to lt_paths. APPEND '/b' TO lt_paths.
li_json = z2ui5_cl_ajson=>create_empty( ). li_json = z2ui5_cl_ajson=>create_empty( ).
li_json->set( li_json->set(
@ -192,16 +192,16 @@ class ltcl_filters_test implementation.
act = li_json_filtered->stringify( ) act = li_json_filtered->stringify( )
exp = '{"a":"1","c":{"d":"3"}}' ). exp = '{"a":"1","c":{"d":"3"}}' ).
endmethod. ENDMETHOD.
method and_filter. METHOD and_filter.
data li_json type ref to z2ui5_if_ajson. DATA li_json TYPE REF TO z2ui5_if_ajson.
data li_json_filtered type ref to z2ui5_if_ajson. DATA li_json_filtered TYPE REF TO z2ui5_if_ajson.
data lt_filters type z2ui5_if_ajson_filter=>ty_filter_tab. DATA lt_filters TYPE z2ui5_if_ajson_filter=>ty_filter_tab.
append z2ui5_cl_ajson_filter_lib=>create_empty_filter( ) to lt_filters. APPEND z2ui5_cl_ajson_filter_lib=>create_empty_filter( ) TO lt_filters.
append z2ui5_cl_ajson_filter_lib=>create_path_filter( iv_skip_paths = '/c' ) to lt_filters. APPEND z2ui5_cl_ajson_filter_lib=>create_path_filter( iv_skip_paths = '/c' ) TO lt_filters.
li_json = z2ui5_cl_ajson=>create_empty( ). li_json = z2ui5_cl_ajson=>create_empty( ).
li_json->set( li_json->set(
@ -225,6 +225,6 @@ class ltcl_filters_test implementation.
act = li_json_filtered->stringify( ) act = li_json_filtered->stringify( )
exp = '{"a":"1"}' ). exp = '{"a":"1"}' ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.

View File

@ -1,156 +1,156 @@
class z2ui5_cl_ajson_mapping definition CLASS z2ui5_cl_ajson_mapping DEFINITION
public PUBLIC
final FINAL
create public. CREATE PUBLIC.
public section. PUBLIC SECTION.
constants: CONSTANTS:
begin of rename_by, BEGIN OF rename_by,
attr_name type i value 0, attr_name TYPE i VALUE 0,
full_path type i value 1, full_path TYPE i VALUE 1,
pattern type i value 2, pattern TYPE i VALUE 2,
" regex type i value 3, " TODO add if needed in future " regex type i value 3, " TODO add if needed in future
end of rename_by. END OF rename_by.
class-methods create_camel_case " DEPRECATED CLASS-METHODS create_camel_case " DEPRECATED
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping=>ty_mapping_fields optional it_mapping_fields TYPE z2ui5_if_ajson_mapping=>ty_mapping_fields OPTIONAL
iv_first_json_upper type abap_bool default abap_true iv_first_json_upper TYPE abap_bool DEFAULT abap_true
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
class-methods create_upper_case CLASS-METHODS create_upper_case
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping=>ty_mapping_fields optional it_mapping_fields TYPE z2ui5_if_ajson_mapping=>ty_mapping_fields OPTIONAL
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
class-methods create_lower_case CLASS-METHODS create_lower_case
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping=>ty_mapping_fields optional it_mapping_fields TYPE z2ui5_if_ajson_mapping=>ty_mapping_fields OPTIONAL
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
class-methods create_field_mapping " DEPRECATED CLASS-METHODS create_field_mapping " DEPRECATED
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping=>ty_mapping_fields it_mapping_fields TYPE z2ui5_if_ajson_mapping=>ty_mapping_fields
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
class-methods create_rename CLASS-METHODS create_rename
importing IMPORTING
it_rename_map type z2ui5_if_ajson_mapping=>tty_rename_map it_rename_map TYPE z2ui5_if_ajson_mapping=>tty_rename_map
iv_rename_by type i default rename_by-attr_name iv_rename_by TYPE i DEFAULT rename_by-attr_name
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
class-methods create_compound_mapper CLASS-METHODS create_compound_mapper
importing IMPORTING
ii_mapper1 type ref to z2ui5_if_ajson_mapping optional ii_mapper1 TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL
ii_mapper2 type ref to z2ui5_if_ajson_mapping optional ii_mapper2 TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL
ii_mapper3 type ref to z2ui5_if_ajson_mapping optional ii_mapper3 TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL
it_more type z2ui5_if_ajson_mapping=>ty_table_of optional it_more TYPE z2ui5_if_ajson_mapping=>ty_table_of OPTIONAL
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
class-methods create_to_snake_case CLASS-METHODS create_to_snake_case
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
class-methods create_to_camel_case CLASS-METHODS create_to_camel_case
importing IMPORTING
iv_first_json_upper type abap_bool default abap_false iv_first_json_upper TYPE abap_bool DEFAULT abap_false
returning RETURNING
value(ri_mapping) type ref to z2ui5_if_ajson_mapping. VALUE(ri_mapping) TYPE REF TO z2ui5_if_ajson_mapping.
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
ENDCLASS. ENDCLASS.
CLASS Z2UI5_CL_AJSON_MAPPING IMPLEMENTATION. CLASS z2ui5_cl_ajson_mapping IMPLEMENTATION.
method create_camel_case. METHOD create_camel_case.
create object ri_mapping type lcl_mapping_camel CREATE OBJECT ri_mapping TYPE lcl_mapping_camel
exporting EXPORTING
it_mapping_fields = it_mapping_fields it_mapping_fields = it_mapping_fields
iv_first_json_upper = iv_first_json_upper. iv_first_json_upper = iv_first_json_upper.
endmethod. ENDMETHOD.
method create_compound_mapper. METHOD create_compound_mapper.
data lt_queue type z2ui5_if_ajson_mapping=>ty_table_of. DATA lt_queue TYPE z2ui5_if_ajson_mapping=>ty_table_of.
append ii_mapper1 to lt_queue. APPEND ii_mapper1 TO lt_queue.
append ii_mapper2 to lt_queue. APPEND ii_mapper2 TO lt_queue.
append ii_mapper3 to lt_queue. APPEND ii_mapper3 TO lt_queue.
append lines of it_more to lt_queue. APPEND LINES OF it_more TO lt_queue.
delete lt_queue where table_line is initial. DELETE lt_queue WHERE table_line IS INITIAL.
create object ri_mapping type lcl_compound_mapper CREATE OBJECT ri_mapping TYPE lcl_compound_mapper
exporting EXPORTING
it_queue = lt_queue. it_queue = lt_queue.
endmethod. ENDMETHOD.
method create_field_mapping. METHOD create_field_mapping.
create object ri_mapping type lcl_mapping_fields CREATE OBJECT ri_mapping TYPE lcl_mapping_fields
exporting EXPORTING
it_mapping_fields = it_mapping_fields. it_mapping_fields = it_mapping_fields.
endmethod. ENDMETHOD.
method create_lower_case. METHOD create_lower_case.
create object ri_mapping type lcl_mapping_to_lower CREATE OBJECT ri_mapping TYPE lcl_mapping_to_lower
exporting EXPORTING
it_mapping_fields = it_mapping_fields. it_mapping_fields = it_mapping_fields.
endmethod. ENDMETHOD.
method create_rename. METHOD create_rename.
create object ri_mapping type lcl_rename CREATE OBJECT ri_mapping TYPE lcl_rename
exporting EXPORTING
it_rename_map = it_rename_map it_rename_map = it_rename_map
iv_rename_by = iv_rename_by. iv_rename_by = iv_rename_by.
endmethod. ENDMETHOD.
method create_to_camel_case. METHOD create_to_camel_case.
create object ri_mapping type lcl_to_camel CREATE OBJECT ri_mapping TYPE lcl_to_camel
exporting EXPORTING
iv_first_json_upper = iv_first_json_upper. iv_first_json_upper = iv_first_json_upper.
endmethod. ENDMETHOD.
method create_to_snake_case. METHOD create_to_snake_case.
create object ri_mapping type lcl_to_snake. CREATE OBJECT ri_mapping TYPE lcl_to_snake.
endmethod. ENDMETHOD.
method create_upper_case. METHOD create_upper_case.
create object ri_mapping type lcl_mapping_to_upper CREATE OBJECT ri_mapping TYPE lcl_mapping_to_upper
exporting EXPORTING
it_mapping_fields = it_mapping_fields. it_mapping_fields = it_mapping_fields.
endmethod. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -1,116 +1,116 @@
class lcl_mapping_fields definition. CLASS lcl_mapping_fields DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
methods constructor METHODS constructor
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping~ty_mapping_fields optional. it_mapping_fields TYPE z2ui5_if_ajson_mapping~ty_mapping_fields OPTIONAL.
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
data mt_mapping_fields type z2ui5_if_ajson_mapping~ty_mapping_fields. DATA mt_mapping_fields TYPE z2ui5_if_ajson_mapping~ty_mapping_fields.
endclass. ENDCLASS.
class lcl_rename definition. CLASS lcl_rename DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
methods constructor METHODS constructor
importing IMPORTING
it_rename_map type z2ui5_if_ajson_mapping~tty_rename_map it_rename_map TYPE z2ui5_if_ajson_mapping~tty_rename_map
iv_rename_by type i. iv_rename_by TYPE i.
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
data mt_rename_map type z2ui5_if_ajson_mapping~tty_rename_map. DATA mt_rename_map TYPE z2ui5_if_ajson_mapping~tty_rename_map.
data mv_rename_by type i. DATA mv_rename_by TYPE i.
endclass. ENDCLASS.
class lcl_mapping_to_upper definition. CLASS lcl_mapping_to_upper DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
methods constructor METHODS constructor
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping~ty_mapping_fields optional. it_mapping_fields TYPE z2ui5_if_ajson_mapping~ty_mapping_fields OPTIONAL.
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
data mi_mapping_fields type ref to z2ui5_if_ajson_mapping. DATA mi_mapping_fields TYPE REF TO z2ui5_if_ajson_mapping.
endclass. ENDCLASS.
class lcl_mapping_to_lower definition. CLASS lcl_mapping_to_lower DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
methods constructor METHODS constructor
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping~ty_mapping_fields optional. it_mapping_fields TYPE z2ui5_if_ajson_mapping~ty_mapping_fields OPTIONAL.
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
data mi_mapping_fields type ref to z2ui5_if_ajson_mapping. DATA mi_mapping_fields TYPE REF TO z2ui5_if_ajson_mapping.
endclass. ENDCLASS.
class lcl_mapping_camel definition. CLASS lcl_mapping_camel DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
methods constructor METHODS constructor
importing IMPORTING
it_mapping_fields type z2ui5_if_ajson_mapping~ty_mapping_fields optional it_mapping_fields TYPE z2ui5_if_ajson_mapping~ty_mapping_fields OPTIONAL
iv_first_json_upper type abap_bool default abap_true. iv_first_json_upper TYPE abap_bool DEFAULT abap_true.
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
data mv_first_json_upper type abap_bool. DATA mv_first_json_upper TYPE abap_bool.
data mi_mapping_fields type ref to z2ui5_if_ajson_mapping. DATA mi_mapping_fields TYPE REF TO z2ui5_if_ajson_mapping.
endclass. ENDCLASS.
class lcl_compound_mapper definition. CLASS lcl_compound_mapper DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
methods constructor METHODS constructor
importing IMPORTING
it_queue type z2ui5_if_ajson_mapping=>ty_table_of. it_queue TYPE z2ui5_if_ajson_mapping=>ty_table_of.
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
data mt_queue type z2ui5_if_ajson_mapping=>ty_table_of. DATA mt_queue TYPE z2ui5_if_ajson_mapping=>ty_table_of.
endclass. ENDCLASS.
class lcl_to_snake definition. CLASS lcl_to_snake DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
endclass. ENDCLASS.
class lcl_to_camel definition. CLASS lcl_to_camel DEFINITION.
public section. PUBLIC SECTION.
interfaces z2ui5_if_ajson_mapping. INTERFACES z2ui5_if_ajson_mapping.
methods constructor METHODS constructor
importing IMPORTING
iv_first_json_upper type abap_bool. iv_first_json_upper TYPE abap_bool.
private section. PRIVATE SECTION.
data mv_first_json_upper type abap_bool. DATA mv_first_json_upper TYPE abap_bool.
endclass. ENDCLASS.

View File

@ -1,335 +1,341 @@
class lcl_mapping_fields implementation. "DEPRECATED CLASS lcl_mapping_fields IMPLEMENTATION. "DEPRECATED
method constructor. METHOD constructor.
data ls_mapping_field like line of mt_mapping_fields. DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
loop at it_mapping_fields into ls_mapping_field. LOOP AT it_mapping_fields INTO ls_mapping_field.
ls_mapping_field-abap = to_upper( ls_mapping_field-abap ). ls_mapping_field-abap = to_upper( ls_mapping_field-abap ).
insert ls_mapping_field into table mt_mapping_fields. INSERT ls_mapping_field INTO TABLE mt_mapping_fields.
endloop. ENDLOOP.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
data ls_mapping_field like line of mt_mapping_fields. DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
read table mt_mapping_fields into ls_mapping_field READ TABLE mt_mapping_fields INTO ls_mapping_field
with key json components json = iv_name. WITH KEY json COMPONENTS json = iv_name.
if sy-subrc = 0. IF sy-subrc = 0.
rv_result = ls_mapping_field-abap. rv_result = ls_mapping_field-abap.
endif. ENDIF.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
data lv_field type string. DATA lv_field TYPE string.
data ls_mapping_field like line of mt_mapping_fields. DATA ls_mapping_field LIKE LINE OF mt_mapping_fields.
lv_field = to_upper( iv_name ). lv_field = to_upper( iv_name ).
read table mt_mapping_fields into ls_mapping_field READ TABLE mt_mapping_fields INTO ls_mapping_field
with key abap components abap = lv_field. WITH KEY abap COMPONENTS abap = lv_field.
if sy-subrc = 0. IF sy-subrc = 0.
rv_result = ls_mapping_field-json. rv_result = ls_mapping_field-json.
endif. ENDIF.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class lcl_rename implementation. CLASS lcl_rename IMPLEMENTATION.
method constructor. METHOD constructor.
mt_rename_map = it_rename_map. mt_rename_map = it_rename_map.
mv_rename_by = iv_rename_by. mv_rename_by = iv_rename_by.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
data lv_full_path type string. DATA lv_full_path TYPE string.
data lv_pair_found type abap_bool. DATA lv_pair_found TYPE abap_bool.
field-symbols <r> like line of mt_rename_map. FIELD-SYMBOLS <r> LIKE LINE OF mt_rename_map.
case mv_rename_by. CASE mv_rename_by.
when z2ui5_cl_ajson_mapping=>rename_by-attr_name. WHEN z2ui5_cl_ajson_mapping=>rename_by-attr_name.
read table mt_rename_map assigning <r> with table key by_name components from = cv_name. READ TABLE mt_rename_map ASSIGNING <r> WITH TABLE KEY by_name COMPONENTS from = cv_name.
lv_pair_found = boolc( sy-subrc = 0 ). lv_pair_found = boolc( sy-subrc = 0 ).
when z2ui5_cl_ajson_mapping=>rename_by-full_path. WHEN z2ui5_cl_ajson_mapping=>rename_by-full_path.
lv_full_path = is_node-path && cv_name. lv_full_path = is_node-path && cv_name.
read table mt_rename_map assigning <r> with table key by_name components from = lv_full_path. READ TABLE mt_rename_map ASSIGNING <r> WITH TABLE KEY by_name COMPONENTS from = lv_full_path.
lv_pair_found = boolc( sy-subrc = 0 ). lv_pair_found = boolc( sy-subrc = 0 ).
when z2ui5_cl_ajson_mapping=>rename_by-pattern. WHEN z2ui5_cl_ajson_mapping=>rename_by-pattern.
lv_full_path = is_node-path && cv_name. lv_full_path = is_node-path && cv_name.
loop at mt_rename_map assigning <r>. LOOP AT mt_rename_map ASSIGNING <r>.
if lv_full_path cp <r>-from. IF lv_full_path CP <r>-from.
lv_pair_found = abap_true. lv_pair_found = abap_true.
exit. EXIT.
endif. ENDIF.
endloop. ENDLOOP.
when others. WHEN OTHERS.
lv_pair_found = abap_false. " No rename lv_pair_found = abap_false. " No rename
endcase. ENDCASE.
if lv_pair_found = abap_true. IF lv_pair_found = abap_true.
cv_name = <r>-to. cv_name = <r>-to.
endif. ENDIF.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class lcl_mapping_to_upper implementation. CLASS lcl_mapping_to_upper IMPLEMENTATION.
method constructor. METHOD constructor.
mi_mapping_fields = z2ui5_cl_ajson_mapping=>create_field_mapping( it_mapping_fields ). mi_mapping_fields = z2ui5_cl_ajson_mapping=>create_field_mapping( it_mapping_fields ).
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
rv_result = mi_mapping_fields->to_abap( iv_path = iv_path iv_name = iv_name ). rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
iv_name = iv_name ).
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
rv_result = mi_mapping_fields->to_json( iv_path = iv_path iv_name = iv_name ). rv_result = mi_mapping_fields->to_json( iv_path = iv_path
iv_name = iv_name ).
if rv_result is not initial. " Mapping found IF rv_result IS NOT INITIAL. " Mapping found
return. RETURN.
endif. ENDIF.
rv_result = to_upper( iv_name ). rv_result = to_upper( iv_name ).
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
cv_name = to_upper( cv_name ). cv_name = to_upper( cv_name ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class lcl_mapping_to_lower implementation. CLASS lcl_mapping_to_lower IMPLEMENTATION.
method constructor. METHOD constructor.
mi_mapping_fields = z2ui5_cl_ajson_mapping=>create_field_mapping( it_mapping_fields ). mi_mapping_fields = z2ui5_cl_ajson_mapping=>create_field_mapping( it_mapping_fields ).
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
rv_result = mi_mapping_fields->to_abap( iv_path = iv_path iv_name = iv_name ). rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
iv_name = iv_name ).
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
rv_result = mi_mapping_fields->to_json( iv_path = iv_path iv_name = iv_name ). rv_result = mi_mapping_fields->to_json( iv_path = iv_path
iv_name = iv_name ).
if rv_result is not initial. " Mapping found IF rv_result IS NOT INITIAL. " Mapping found
return. RETURN.
endif. ENDIF.
rv_result = to_lower( iv_name ). rv_result = to_lower( iv_name ).
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
cv_name = to_lower( cv_name ). cv_name = to_lower( cv_name ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class lcl_mapping_camel implementation. "DEPRECATED CLASS lcl_mapping_camel IMPLEMENTATION. "DEPRECATED
method constructor. METHOD constructor.
mi_mapping_fields = z2ui5_cl_ajson_mapping=>create_field_mapping( it_mapping_fields ). mi_mapping_fields = z2ui5_cl_ajson_mapping=>create_field_mapping( it_mapping_fields ).
mv_first_json_upper = iv_first_json_upper. mv_first_json_upper = iv_first_json_upper.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
rv_result = mi_mapping_fields->to_abap( iv_path = iv_path iv_name = iv_name ). rv_result = mi_mapping_fields->to_abap( iv_path = iv_path
iv_name = iv_name ).
if rv_result is not initial. " Mapping found IF rv_result IS NOT INITIAL. " Mapping found
return. RETURN.
endif. ENDIF.
rv_result = iv_name. rv_result = iv_name.
replace all occurrences of regex `([a-z])([A-Z])` in rv_result with `$1_$2`. "#EC NOTEXT REPLACE ALL OCCURRENCES OF REGEX `([a-z])([A-Z])` IN rv_result WITH `$1_$2`.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
types ty_token type c length 255. TYPES ty_token TYPE c LENGTH 255.
data lt_tokens TYPE STANDARD TABLE OF ty_token. DATA lt_tokens TYPE STANDARD TABLE OF ty_token.
data lv_from type i. DATA lv_from TYPE i.
field-symbols <token> like line of lt_tokens. FIELD-SYMBOLS <token> LIKE LINE OF lt_tokens.
rv_result = mi_mapping_fields->to_json( iv_path = iv_path iv_name = iv_name ). rv_result = mi_mapping_fields->to_json( iv_path = iv_path
iv_name = iv_name ).
if rv_result is not initial. " Mapping found IF rv_result IS NOT INITIAL. " Mapping found
return. RETURN.
endif. ENDIF.
rv_result = iv_name. rv_result = iv_name.
replace all occurrences of `__` in rv_result with `*`. REPLACE ALL OCCURRENCES OF `__` IN rv_result WITH `*`.
translate rv_result to lower case. TRANSLATE rv_result TO LOWER CASE.
translate rv_result using `/_:_~_`. TRANSLATE rv_result USING `/_:_~_`.
if mv_first_json_upper = abap_true. IF mv_first_json_upper = abap_true.
lv_from = 1. lv_from = 1.
else. ELSE.
lv_from = 2. lv_from = 2.
endif. ENDIF.
split rv_result at `_` into table lt_tokens. SPLIT rv_result AT `_` INTO TABLE lt_tokens.
loop at lt_tokens assigning <token> from lv_from. LOOP AT lt_tokens ASSIGNING <token> FROM lv_from.
translate <token>(1) to upper case. TRANSLATE <token>(1) TO UPPER CASE.
endloop. ENDLOOP.
concatenate lines of lt_tokens into rv_result. CONCATENATE LINES OF lt_tokens INTO rv_result.
replace all occurrences of `*` in rv_result with `_`. REPLACE ALL OCCURRENCES OF `*` IN rv_result WITH `_`.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class lcl_compound_mapper implementation. CLASS lcl_compound_mapper IMPLEMENTATION.
method constructor. METHOD constructor.
mt_queue = it_queue. mt_queue = it_queue.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
data ls_node like is_node. DATA ls_node LIKE is_node.
data li_mapper like line of mt_queue. DATA li_mapper LIKE LINE OF mt_queue.
ls_node = is_node. ls_node = is_node.
loop at mt_queue into li_mapper. LOOP AT mt_queue INTO li_mapper.
li_mapper->rename_node( li_mapper->rename_node(
exporting EXPORTING
is_node = ls_node is_node = ls_node
changing CHANGING
cv_name = cv_name ). cv_name = cv_name ).
ls_node-name = cv_name. ls_node-name = cv_name.
endloop. ENDLOOP.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class lcl_to_snake implementation. CLASS lcl_to_snake IMPLEMENTATION.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
replace all occurrences of regex `([a-z])([A-Z])` in cv_name with `$1_$2`. "#EC NOTEXT REPLACE ALL OCCURRENCES OF REGEX `([a-z])([A-Z])` IN cv_name WITH `$1_$2`.
cv_name = to_lower( cv_name ). cv_name = to_lower( cv_name ).
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class lcl_to_camel implementation. CLASS lcl_to_camel IMPLEMENTATION.
method constructor. METHOD constructor.
mv_first_json_upper = iv_first_json_upper. mv_first_json_upper = iv_first_json_upper.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~rename_node. METHOD z2ui5_if_ajson_mapping~rename_node.
types lty_token type c length 255. TYPES lty_token TYPE c LENGTH 255.
constants lc_forced_underscore_marker type c length 1 value cl_abap_char_utilities=>horizontal_tab. CONSTANTS lc_forced_underscore_marker TYPE c LENGTH 1 VALUE cl_abap_char_utilities=>horizontal_tab.
data lt_tokens TYPE STANDARD TABLE OF lty_token. DATA lt_tokens TYPE STANDARD TABLE OF lty_token.
data lv_from type i. DATA lv_from TYPE i.
field-symbols <token> like line of lt_tokens. FIELD-SYMBOLS <token> LIKE LINE OF lt_tokens.
if mv_first_json_upper = abap_true. IF mv_first_json_upper = abap_true.
lv_from = 1. lv_from = 1.
else. ELSE.
lv_from = 2. lv_from = 2.
endif. ENDIF.
replace all occurrences of `__` in cv_name with lc_forced_underscore_marker. " Force underscore REPLACE ALL OCCURRENCES OF `__` IN cv_name WITH lc_forced_underscore_marker. " Force underscore
split cv_name at `_` into table lt_tokens. SPLIT cv_name AT `_` INTO TABLE lt_tokens.
delete lt_tokens where table_line is initial. DELETE lt_tokens WHERE table_line IS INITIAL.
loop at lt_tokens assigning <token> from lv_from. LOOP AT lt_tokens ASSIGNING <token> FROM lv_from.
translate <token>+0(1) to upper case. TRANSLATE <token>+0(1) TO UPPER CASE.
endloop. ENDLOOP.
concatenate lines of lt_tokens into cv_name. CONCATENATE LINES OF lt_tokens INTO cv_name.
replace all occurrences of lc_forced_underscore_marker in cv_name with `_`. REPLACE ALL OCCURRENCES OF lc_forced_underscore_marker IN cv_name WITH `_`.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_abap. METHOD z2ui5_if_ajson_mapping~to_abap.
endmethod. ENDMETHOD.
method z2ui5_if_ajson_mapping~to_json. METHOD z2ui5_if_ajson_mapping~to_json.
endmethod. ENDMETHOD.
endclass. ENDCLASS.

View File

@ -1,84 +1,86 @@
class ltcl_test_mappers definition final for testing CLASS ltcl_test_mappers DEFINITION FINAL FOR TESTING
duration short DURATION SHORT
risk level harmless. RISK LEVEL HARMLESS.
private section. PRIVATE SECTION.
methods: METHODS:
from_json_to_json for testing raising z2UI5_cx_ajson_error, from_json_to_json FOR TESTING RAISING z2ui5_cx_ajson_error,
to_abap for testing raising z2UI5_cx_ajson_error, to_abap FOR TESTING RAISING z2ui5_cx_ajson_error,
to_json for testing raising z2UI5_cx_ajson_error, to_json FOR TESTING RAISING z2ui5_cx_ajson_error,
to_json_nested_struc for testing raising z2UI5_cx_ajson_error, to_json_nested_struc FOR TESTING RAISING z2ui5_cx_ajson_error,
to_json_nested_table for testing raising z2UI5_cx_ajson_error, to_json_nested_table FOR TESTING RAISING z2ui5_cx_ajson_error,
to_json_first_lower for testing raising z2UI5_cx_ajson_error. to_json_first_lower FOR TESTING RAISING z2ui5_cx_ajson_error.
methods: METHODS:
to_snake for testing raising z2UI5_cx_ajson_error, to_snake FOR TESTING RAISING z2ui5_cx_ajson_error,
to_camel for testing raising z2UI5_cx_ajson_error, to_camel FOR TESTING RAISING z2ui5_cx_ajson_error,
to_camel_1st_upper for testing raising z2UI5_cx_ajson_error, to_camel_1st_upper FOR TESTING RAISING z2ui5_cx_ajson_error,
rename_by_attr for testing raising z2UI5_cx_ajson_error, rename_by_attr FOR TESTING RAISING z2ui5_cx_ajson_error,
rename_by_path for testing raising z2UI5_cx_ajson_error, rename_by_path FOR TESTING RAISING z2ui5_cx_ajson_error,
rename_by_pattern for testing raising z2UI5_cx_ajson_error, rename_by_pattern FOR TESTING RAISING z2ui5_cx_ajson_error,
compound_mapper for testing raising z2UI5_cx_ajson_error, compound_mapper FOR TESTING RAISING z2ui5_cx_ajson_error,
test_to_upper for testing raising z2UI5_cx_ajson_error, test_to_upper FOR TESTING RAISING z2ui5_cx_ajson_error,
test_to_lower for testing raising z2UI5_cx_ajson_error. test_to_lower FOR TESTING RAISING z2ui5_cx_ajson_error.
endclass. ENDCLASS.
class ltcl_test_mappers implementation. CLASS ltcl_test_mappers IMPLEMENTATION.
method from_json_to_json. METHOD from_json_to_json.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson. lo_ajson TYPE REF TO z2ui5_cl_ajson.
lo_ajson = lo_ajson =
z2ui5_cl_ajson=>parse( z2ui5_cl_ajson=>parse(
iv_json = `{"fieldData":"field_value"}` iv_json = `{"fieldData":"field_value"}`
ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ) ). ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ) ).
lo_ajson->set_string( iv_path = `/fieldData` iv_val = 'E' ). lo_ajson->set_string( iv_path = `/fieldData`
iv_val = 'E' ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( ) act = lo_ajson->stringify( )
exp = '{"fieldData":"E"}' ). exp = '{"fieldData":"E"}' ).
endmethod. ENDMETHOD.
method to_abap. METHOD to_abap.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping. li_mapping TYPE REF TO z2ui5_if_ajson_mapping.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
field_data type string, field_data TYPE string,
end of ls_result. END OF ls_result.
li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( ). li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( ).
lo_ajson = z2ui5_cl_ajson=>parse( iv_json = '{"FieldData":"field_value"}' ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>parse( iv_json = '{"FieldData":"field_value"}'
ii_custom_mapping = li_mapping ).
lo_ajson->to_abap( importing ev_container = ls_result ). lo_ajson->to_abap( IMPORTING ev_container = ls_result ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = ls_result-field_data act = ls_result-field_data
exp = 'field_value' ). exp = 'field_value' ).
endmethod. ENDMETHOD.
method to_json. METHOD to_json.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping. li_mapping TYPE REF TO z2ui5_if_ajson_mapping.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
field_data type string, field_data TYPE string,
end of ls_result. END OF ls_result.
li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ). li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ).
@ -86,27 +88,28 @@ class ltcl_test_mappers implementation.
lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/' iv_val = ls_result ). lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( ) act = lo_ajson->stringify( )
exp = '{"fieldData":"field_value"}' ). exp = '{"fieldData":"field_value"}' ).
endmethod. ENDMETHOD.
method to_json_nested_struc. METHOD to_json_nested_struc.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping. li_mapping TYPE REF TO z2ui5_if_ajson_mapping.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
field_data type string, field_data TYPE string,
begin of struc_data, BEGIN OF struc_data,
field_more type string, field_more TYPE string,
end of struc_data, END OF struc_data,
end of ls_result. END OF ls_result.
li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ). li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ).
@ -115,34 +118,35 @@ class ltcl_test_mappers implementation.
lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/' iv_val = ls_result ). lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( ) act = lo_ajson->stringify( )
exp = '{"fieldData":"field_value","strucData":{"fieldMore":"field_more"}}' ). exp = '{"fieldData":"field_value","strucData":{"fieldMore":"field_more"}}' ).
endmethod. ENDMETHOD.
method to_json_nested_table. METHOD to_json_nested_table.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping. li_mapping TYPE REF TO z2ui5_if_ajson_mapping.
data: DATA:
lv_value type string, lv_value TYPE string,
begin of ls_result, BEGIN OF ls_result,
field_data type string, field_data TYPE string,
begin of struc_data, BEGIN OF struc_data,
field_more type string_table, field_more TYPE string_table,
end of struc_data, END OF struc_data,
end of ls_result. END OF ls_result.
li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ). li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( iv_first_json_upper = abap_false ).
ls_result-field_data = 'field_value'. ls_result-field_data = 'field_value'.
lv_value = 'field_more'. lv_value = 'field_more'.
insert lv_value into table ls_result-struc_data-field_more. INSERT lv_value INTO TABLE ls_result-struc_data-field_more.
lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ).
@ -153,18 +157,18 @@ class ltcl_test_mappers implementation.
act = lo_ajson->stringify( ) act = lo_ajson->stringify( )
exp = '{"fieldData":"field_value","strucData":{"fieldMore":["field_more"]}}' ). exp = '{"fieldData":"field_value","strucData":{"fieldMore":["field_more"]}}' ).
endmethod. ENDMETHOD.
method to_json_first_lower. METHOD to_json_first_lower.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping. li_mapping TYPE REF TO z2ui5_if_ajson_mapping.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
field_data type string, field_data TYPE string,
end of ls_result. END OF ls_result.
li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( ). li_mapping = z2ui5_cl_ajson_mapping=>create_camel_case( ).
@ -172,16 +176,17 @@ class ltcl_test_mappers implementation.
lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/' iv_val = ls_result ). lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( ) act = lo_ajson->stringify( )
exp = '{"FieldData":"field_value"}' ). exp = '{"FieldData":"field_value"}' ).
endmethod. ENDMETHOD.
method test_to_upper. METHOD test_to_upper.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = z2ui5_cl_ajson=>create_from( act = z2ui5_cl_ajson=>create_from(
@ -195,9 +200,9 @@ class ltcl_test_mappers implementation.
)->stringify( ) )->stringify( )
exp = '{"A":1,"B":{"C":2}}' ). exp = '{"A":1,"B":{"C":2}}' ).
endmethod. ENDMETHOD.
method test_to_lower. METHOD test_to_lower.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = z2ui5_cl_ajson=>create_from( act = z2ui5_cl_ajson=>create_from(
@ -211,20 +216,20 @@ class ltcl_test_mappers implementation.
)->stringify( ) )->stringify( )
exp = '{"a":1,"b":{"c":2}}' ). exp = '{"a":1,"b":{"c":2}}' ).
endmethod. ENDMETHOD.
method rename_by_attr. METHOD rename_by_attr.
data lt_map type z2ui5_if_ajson_mapping=>tty_rename_map. DATA lt_map TYPE z2ui5_if_ajson_mapping=>tty_rename_map.
field-symbols <i> like line of lt_map. FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
append initial line to lt_map assigning <i>. APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
<i>-from = 'a'. <i>-from = 'a'.
<i>-to = 'x'. <i>-to = 'x'.
append initial line to lt_map assigning <i>. APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
<i>-from = 'c'. <i>-from = 'c'.
<i>-to = 'y'. <i>-to = 'y'.
append initial line to lt_map assigning <i>. APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
<i>-from = 'd'. <i>-from = 'd'.
<i>-to = 'z'. <i>-to = 'z'.
@ -235,14 +240,14 @@ class ltcl_test_mappers implementation.
) )->stringify( ) ) )->stringify( )
exp = '{"b":{"y":2},"x":1,"z":{"e":3}}' ). exp = '{"b":{"y":2},"x":1,"z":{"e":3}}' ).
endmethod. ENDMETHOD.
method rename_by_path. METHOD rename_by_path.
data lt_map type z2ui5_if_ajson_mapping=>tty_rename_map. DATA lt_map TYPE z2ui5_if_ajson_mapping=>tty_rename_map.
field-symbols <i> like line of lt_map. FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
append initial line to lt_map assigning <i>. APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
<i>-from = '/b/a'. <i>-from = '/b/a'.
<i>-to = 'x'. <i>-to = 'x'.
@ -255,14 +260,14 @@ class ltcl_test_mappers implementation.
) )->stringify( ) ) )->stringify( )
exp = '{"a":1,"b":{"x":2},"c":{"a":3}}' ). exp = '{"a":1,"b":{"x":2},"c":{"a":3}}' ).
endmethod. ENDMETHOD.
method rename_by_pattern. METHOD rename_by_pattern.
data lt_map type z2ui5_if_ajson_mapping=>tty_rename_map. DATA lt_map TYPE z2ui5_if_ajson_mapping=>tty_rename_map.
field-symbols <i> like line of lt_map. FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
append initial line to lt_map assigning <i>. APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
<i>-from = '/*/this*'. <i>-from = '/*/this*'.
<i>-to = 'x'. <i>-to = 'x'.
@ -275,14 +280,14 @@ class ltcl_test_mappers implementation.
) )->stringify( ) ) )->stringify( )
exp = '{"andthisnot":1,"b":{"x":2},"c":{"a":3}}' ). exp = '{"andthisnot":1,"b":{"x":2},"c":{"a":3}}' ).
endmethod. ENDMETHOD.
method compound_mapper. METHOD compound_mapper.
data lt_map type z2ui5_if_ajson_mapping=>tty_rename_map. DATA lt_map TYPE z2ui5_if_ajson_mapping=>tty_rename_map.
field-symbols <i> like line of lt_map. FIELD-SYMBOLS <i> LIKE LINE OF lt_map.
append initial line to lt_map assigning <i>. APPEND INITIAL LINE TO lt_map ASSIGNING <i>.
<i>-from = '/b/a'. <i>-from = '/b/a'.
<i>-to = 'x'. <i>-to = 'x'.
@ -297,9 +302,9 @@ class ltcl_test_mappers implementation.
)->stringify( ) )->stringify( )
exp = '{"A":1,"B":{"X":2},"C":{"A":3}}' ). exp = '{"A":1,"B":{"X":2},"C":{"A":3}}' ).
endmethod. ENDMETHOD.
method to_snake. METHOD to_snake.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = z2ui5_cl_ajson=>create_from( act = z2ui5_cl_ajson=>create_from(
@ -308,9 +313,9 @@ class ltcl_test_mappers implementation.
)->stringify( ) )->stringify( )
exp = '{"a_b":1,"bb_c":2,"c_d":{"x_y":3},"zz":4}' ). exp = '{"a_b":1,"bb_c":2,"c_d":{"x_y":3},"zz":4}' ).
endmethod. ENDMETHOD.
method to_camel. METHOD to_camel.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = z2ui5_cl_ajson=>create_from( act = z2ui5_cl_ajson=>create_from(
@ -327,9 +332,9 @@ class ltcl_test_mappers implementation.
)->stringify( ) )->stringify( )
exp = '{"a_b":1}' ). exp = '{"a_b":1}' ).
endmethod. ENDMETHOD.
method to_camel_1st_upper. METHOD to_camel_1st_upper.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = z2ui5_cl_ajson=>create_from( act = z2ui5_cl_ajson=>create_from(
@ -338,54 +343,55 @@ class ltcl_test_mappers implementation.
)->stringify( ) )->stringify( )
exp = '{"AjBc":1,"BbC":2,"CD":{"XqYq":3},"Zz":4}' ). exp = '{"AjBc":1,"BbC":2,"CD":{"XqYq":3},"Zz":4}' ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class ltcl_fields definition final for testing CLASS ltcl_fields DEFINITION FINAL FOR TESTING
duration short DURATION SHORT
risk level harmless. RISK LEVEL HARMLESS.
private section. PRIVATE SECTION.
methods: METHODS:
to_json_without_path for testing raising z2UI5_cx_ajson_error, to_json_without_path FOR TESTING RAISING z2ui5_cx_ajson_error,
to_json_with_path for testing raising z2UI5_cx_ajson_error, to_json_with_path FOR TESTING RAISING z2ui5_cx_ajson_error,
to_abap for testing raising z2UI5_cx_ajson_error, to_abap FOR TESTING RAISING z2ui5_cx_ajson_error,
to_json importing iv_path type string returning value(rv_result) type string raising z2UI5_cx_ajson_error. to_json IMPORTING iv_path TYPE string RETURNING VALUE(rv_result) TYPE string RAISING z2ui5_cx_ajson_error.
endclass. ENDCLASS.
class ltcl_fields implementation. CLASS ltcl_fields IMPLEMENTATION.
method to_abap. METHOD to_abap.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping, li_mapping TYPE REF TO z2ui5_if_ajson_mapping,
lt_mapping_fields type z2ui5_if_ajson_mapping=>ty_mapping_fields, lt_mapping_fields TYPE z2ui5_if_ajson_mapping=>ty_mapping_fields,
ls_mapping_field like line of lt_mapping_fields. ls_mapping_field LIKE LINE OF lt_mapping_fields.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
abap_field type string, abap_field TYPE string,
field type string, field TYPE string,
end of ls_result. END OF ls_result.
clear ls_mapping_field. CLEAR ls_mapping_field.
ls_mapping_field-abap = 'ABAP_FIELD'. ls_mapping_field-abap = 'ABAP_FIELD'.
ls_mapping_field-json = 'json.field'. ls_mapping_field-json = 'json.field'.
insert ls_mapping_field into table lt_mapping_fields. INSERT ls_mapping_field INTO TABLE lt_mapping_fields.
li_mapping = z2ui5_cl_ajson_mapping=>create_field_mapping( lt_mapping_fields ). li_mapping = z2ui5_cl_ajson_mapping=>create_field_mapping( lt_mapping_fields ).
lo_ajson = lo_ajson =
z2ui5_cl_ajson=>parse( iv_json = '{"field":"value","json.field":"field_value"}' ii_custom_mapping = li_mapping ). z2ui5_cl_ajson=>parse( iv_json = '{"field":"value","json.field":"field_value"}'
ii_custom_mapping = li_mapping ).
lo_ajson->to_abap( importing ev_container = ls_result ). lo_ajson->to_abap( IMPORTING ev_container = ls_result ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = ls_result-abap_field act = ls_result-abap_field
@ -395,44 +401,44 @@ class ltcl_fields implementation.
act = ls_result-field act = ls_result-field
exp = 'value' ). exp = 'value' ).
endmethod. ENDMETHOD.
method to_json_without_path. METHOD to_json_without_path.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = to_json( `/` ) act = to_json( `/` )
exp = '{"field":"value","json.field":"field_value"}' ). exp = '{"field":"value","json.field":"field_value"}' ).
endmethod. ENDMETHOD.
method to_json_with_path. METHOD to_json_with_path.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = to_json( '/samplePath' ) act = to_json( '/samplePath' )
exp = '{"samplePath":{"field":"value","json.field":"field_value"}}' ). exp = '{"samplePath":{"field":"value","json.field":"field_value"}}' ).
endmethod. ENDMETHOD.
method to_json. METHOD to_json.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping, li_mapping TYPE REF TO z2ui5_if_ajson_mapping,
lt_mapping_fields type z2ui5_if_ajson_mapping=>ty_mapping_fields, lt_mapping_fields TYPE z2ui5_if_ajson_mapping=>ty_mapping_fields,
ls_mapping_field like line of lt_mapping_fields. ls_mapping_field LIKE LINE OF lt_mapping_fields.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
abap_field type string, abap_field TYPE string,
field type string, field TYPE string,
end of ls_result. END OF ls_result.
clear ls_mapping_field. CLEAR ls_mapping_field.
ls_mapping_field-abap = 'ABAP_FIELD'. ls_mapping_field-abap = 'ABAP_FIELD'.
ls_mapping_field-json = 'json.field'. ls_mapping_field-json = 'json.field'.
insert ls_mapping_field into table lt_mapping_fields. INSERT ls_mapping_field INTO TABLE lt_mapping_fields.
li_mapping = z2ui5_cl_ajson_mapping=>create_field_mapping( lt_mapping_fields ). li_mapping = z2ui5_cl_ajson_mapping=>create_field_mapping( lt_mapping_fields ).
@ -441,39 +447,40 @@ class ltcl_fields implementation.
lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = iv_path iv_val = ls_result ). lo_ajson->set( iv_path = iv_path
iv_val = ls_result ).
rv_result = lo_ajson->stringify( ). rv_result = lo_ajson->stringify( ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class ltcl_to_lower definition final for testing CLASS ltcl_to_lower DEFINITION FINAL FOR TESTING
duration short DURATION SHORT
risk level harmless. RISK LEVEL HARMLESS.
private section. PRIVATE SECTION.
methods: METHODS:
to_json for testing raising z2UI5_cx_ajson_error. to_json FOR TESTING RAISING z2ui5_cx_ajson_error.
endclass. ENDCLASS.
class ltcl_to_lower implementation. CLASS ltcl_to_lower IMPLEMENTATION.
method to_json. METHOD to_json.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping. li_mapping TYPE REF TO z2ui5_if_ajson_mapping.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
field_data type string, field_data TYPE string,
end of ls_result. END OF ls_result.
li_mapping = z2ui5_cl_ajson_mapping=>create_lower_case( ). li_mapping = z2ui5_cl_ajson_mapping=>create_lower_case( ).
@ -481,41 +488,42 @@ class ltcl_to_lower implementation.
lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/' iv_val = ls_result ). lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( ) act = lo_ajson->stringify( )
exp = '{"field_data":"field_value"}' ). exp = '{"field_data":"field_value"}' ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.
class ltcl_to_upper definition final for testing CLASS ltcl_to_upper DEFINITION FINAL FOR TESTING
duration short DURATION SHORT
risk level harmless. RISK LEVEL HARMLESS.
private section. PRIVATE SECTION.
methods: METHODS:
to_json for testing raising z2UI5_cx_ajson_error. to_json FOR TESTING RAISING z2ui5_cx_ajson_error.
endclass. ENDCLASS.
class ltcl_to_upper implementation. CLASS ltcl_to_upper IMPLEMENTATION.
method to_json. METHOD to_json.
data: DATA:
lo_ajson type ref to z2ui5_cl_ajson, lo_ajson TYPE REF TO z2ui5_cl_ajson,
li_mapping type ref to z2ui5_if_ajson_mapping. li_mapping TYPE REF TO z2ui5_if_ajson_mapping.
data: DATA:
begin of ls_result, BEGIN OF ls_result,
field_data type string, field_data TYPE string,
end of ls_result. END OF ls_result.
li_mapping = z2ui5_cl_ajson_mapping=>create_upper_case( ). li_mapping = z2ui5_cl_ajson_mapping=>create_upper_case( ).
@ -523,13 +531,14 @@ class ltcl_to_upper implementation.
lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ). lo_ajson = z2ui5_cl_ajson=>create_empty( ii_custom_mapping = li_mapping ).
lo_ajson->set( iv_path = '/' iv_val = ls_result ). lo_ajson->set( iv_path = '/'
iv_val = ls_result ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = lo_ajson->stringify( ) act = lo_ajson->stringify( )
exp = '{"FIELD_DATA":"field_value"}' ). exp = '{"FIELD_DATA":"field_value"}' ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.

View File

@ -1,136 +1,136 @@
class z2ui5_cl_ajson_utilities definition CLASS z2ui5_cl_ajson_utilities DEFINITION
public PUBLIC
create public . CREATE PUBLIC .
public section. PUBLIC SECTION.
class-methods new CLASS-METHODS new
returning RETURNING
value(ro_instance) type ref to z2ui5_cl_ajson_utilities. VALUE(ro_instance) TYPE REF TO z2ui5_cl_ajson_utilities.
methods diff METHODS diff
importing IMPORTING
!iv_json_a type string optional !iv_json_a TYPE string OPTIONAL
!iv_json_b type string optional !iv_json_b TYPE string OPTIONAL
!io_json_a type ref to z2ui5_if_ajson optional !io_json_a TYPE REF TO z2ui5_if_ajson OPTIONAL
!io_json_b type ref to z2ui5_if_ajson optional !io_json_b TYPE REF TO z2ui5_if_ajson OPTIONAL
!iv_keep_empty_arrays type abap_bool default abap_false !iv_keep_empty_arrays TYPE abap_bool DEFAULT abap_false
exporting EXPORTING
!eo_insert type ref to z2ui5_if_ajson !eo_insert TYPE REF TO z2ui5_if_ajson
!eo_delete type ref to z2ui5_if_ajson !eo_delete TYPE REF TO z2ui5_if_ajson
!eo_change type ref to z2ui5_if_ajson !eo_change TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
methods merge METHODS merge
importing IMPORTING
!iv_json_a type string optional !iv_json_a TYPE string OPTIONAL
!iv_json_b type string optional !iv_json_b TYPE string OPTIONAL
!io_json_a type ref to z2ui5_if_ajson optional !io_json_a TYPE REF TO z2ui5_if_ajson OPTIONAL
!io_json_b type ref to z2ui5_if_ajson optional !io_json_b TYPE REF TO z2ui5_if_ajson OPTIONAL
!iv_keep_empty_arrays type abap_bool default abap_false !iv_keep_empty_arrays TYPE abap_bool DEFAULT abap_false
returning RETURNING
value(ro_json) type ref to z2ui5_if_ajson VALUE(ro_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
methods sort METHODS sort
importing IMPORTING
!iv_json type string optional !iv_json TYPE string OPTIONAL
!io_json type ref to z2ui5_if_ajson optional !io_json TYPE REF TO z2ui5_if_ajson OPTIONAL
returning RETURNING
value(rv_sorted) type string VALUE(rv_sorted) TYPE string
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
methods is_equal METHODS is_equal
importing IMPORTING
!iv_json_a type string optional !iv_json_a TYPE string OPTIONAL
!iv_json_b type string optional !iv_json_b TYPE string OPTIONAL
!ii_json_a type ref to z2ui5_if_ajson optional !ii_json_a TYPE REF TO z2ui5_if_ajson OPTIONAL
!ii_json_b type ref to z2ui5_if_ajson optional !ii_json_b TYPE REF TO z2ui5_if_ajson OPTIONAL
returning RETURNING
value(rv_yes) type abap_bool VALUE(rv_yes) TYPE abap_bool
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
protected section. PROTECTED SECTION.
private section. PRIVATE SECTION.
data mo_json_a type ref to z2ui5_if_ajson . DATA mo_json_a TYPE REF TO z2ui5_if_ajson .
data mo_json_b type ref to z2ui5_if_ajson . DATA mo_json_b TYPE REF TO z2ui5_if_ajson .
data mo_insert type ref to z2ui5_if_ajson . DATA mo_insert TYPE REF TO z2ui5_if_ajson .
data mo_delete type ref to z2ui5_if_ajson . DATA mo_delete TYPE REF TO z2ui5_if_ajson .
data mo_change type ref to z2ui5_if_ajson . DATA mo_change TYPE REF TO z2ui5_if_ajson .
methods normalize_input METHODS normalize_input
importing IMPORTING
!iv_json type string optional !iv_json TYPE string OPTIONAL
!io_json type ref to z2ui5_if_ajson optional !io_json TYPE REF TO z2ui5_if_ajson OPTIONAL
returning RETURNING
value(ro_json) type ref to z2ui5_if_ajson VALUE(ro_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
methods diff_a_b METHODS diff_a_b
importing IMPORTING
!iv_path type string !iv_path TYPE string
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
methods diff_b_a METHODS diff_b_a
importing IMPORTING
!iv_path type string !iv_path TYPE string
!iv_array type abap_bool default abap_false !iv_array TYPE abap_bool DEFAULT abap_false
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
methods delete_empty_nodes METHODS delete_empty_nodes
importing IMPORTING
!io_json type ref to z2ui5_if_ajson !io_json TYPE REF TO z2ui5_if_ajson
!iv_keep_empty_arrays type abap_bool !iv_keep_empty_arrays TYPE abap_bool
raising RAISING
z2UI5_cx_ajson_error . z2ui5_cx_ajson_error .
ENDCLASS. ENDCLASS.
CLASS Z2UI5_CL_AJSON_UTILITIES IMPLEMENTATION. CLASS z2ui5_cl_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_done type abap_bool. DATA lv_done TYPE abap_bool.
do. DO.
lv_done = abap_true. lv_done = abap_true.
if iv_keep_empty_arrays = abap_false. 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 = z2ui5_if_ajson_types=>node_type-array and children = 0. WHERE type = z2ui5_if_ajson_types=>node_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.
if sy-subrc = 0. IF sy-subrc = 0.
lv_done = abap_false. lv_done = abap_false.
endif. ENDIF.
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 = z2ui5_if_ajson_types=>node_type-object and children = 0. WHERE type = z2ui5_if_ajson_types=>node_type-object 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.
if sy-subrc = 0. IF sy-subrc = 0.
lv_done = abap_false. lv_done = abap_false.
endif. ENDIF.
if lv_done = abap_true. IF lv_done = abap_true.
exit. " nothing else to delete EXIT. " nothing else to delete
endif. ENDIF.
enddo. ENDDO.
endmethod. ENDMETHOD.
method diff. METHOD diff.
mo_json_a = normalize_input( mo_json_a = normalize_input(
iv_json = iv_json_a iv_json = iv_json_a
@ -161,162 +161,162 @@ CLASS Z2UI5_CL_AJSON_UTILITIES IMPLEMENTATION.
io_json = eo_change io_json = eo_change
iv_keep_empty_arrays = iv_keep_empty_arrays ). iv_keep_empty_arrays = iv_keep_empty_arrays ).
endmethod. ENDMETHOD.
method diff_a_b. METHOD diff_a_b.
data: DATA:
lv_path_a type string, lv_path_a TYPE string,
lv_path_b type string. lv_path_b TYPE string.
field-symbols: FIELD-SYMBOLS:
<node_a> like line of mo_json_a->mt_json_tree, <node_a> LIKE LINE OF mo_json_a->mt_json_tree,
<node_b> like line of mo_json_a->mt_json_tree. <node_b> LIKE LINE OF mo_json_a->mt_json_tree.
loop at mo_json_a->mt_json_tree assigning <node_a> where path = iv_path. LOOP AT mo_json_a->mt_json_tree ASSIGNING <node_a> WHERE path = iv_path.
lv_path_a = <node_a>-path && <node_a>-name && '/'. lv_path_a = <node_a>-path && <node_a>-name && '/'.
read table mo_json_b->mt_json_tree assigning <node_b> READ TABLE mo_json_b->mt_json_tree ASSIGNING <node_b>
with table key path = <node_a>-path name = <node_a>-name. WITH TABLE KEY path = <node_a>-path name = <node_a>-name.
if sy-subrc = 0. IF sy-subrc = 0.
lv_path_b = <node_b>-path && <node_b>-name && '/'. lv_path_b = <node_b>-path && <node_b>-name && '/'.
if <node_a>-type = <node_b>-type. IF <node_a>-type = <node_b>-type.
case <node_a>-type. CASE <node_a>-type.
when z2ui5_if_ajson_types=>node_type-array. WHEN z2ui5_if_ajson_types=>node_type-array.
mo_insert->touch_array( lv_path_a ). mo_insert->touch_array( lv_path_a ).
mo_change->touch_array( lv_path_a ). mo_change->touch_array( lv_path_a ).
mo_delete->touch_array( lv_path_a ). mo_delete->touch_array( lv_path_a ).
diff_a_b( lv_path_a ). diff_a_b( lv_path_a ).
when z2ui5_if_ajson_types=>node_type-object. WHEN z2ui5_if_ajson_types=>node_type-object.
diff_a_b( lv_path_a ). diff_a_b( lv_path_a ).
when others. WHEN OTHERS.
if <node_a>-value <> <node_b>-value. IF <node_a>-value <> <node_b>-value.
" save as changed value " save as changed value
mo_change->set( mo_change->set(
iv_path = lv_path_b iv_path = lv_path_b
iv_val = <node_b>-value iv_val = <node_b>-value
iv_node_type = <node_b>-type ). iv_node_type = <node_b>-type ).
endif. ENDIF.
endcase. ENDCASE.
else. ELSE.
" save changed type as delete + insert " save changed type as delete + insert
case <node_a>-type. CASE <node_a>-type.
when z2ui5_if_ajson_types=>node_type-array. WHEN z2ui5_if_ajson_types=>node_type-array.
mo_delete->touch_array( lv_path_a ). mo_delete->touch_array( lv_path_a ).
diff_a_b( lv_path_a ). diff_a_b( lv_path_a ).
when z2ui5_if_ajson_types=>node_type-object. WHEN z2ui5_if_ajson_types=>node_type-object.
diff_a_b( lv_path_a ). diff_a_b( lv_path_a ).
when others. WHEN OTHERS.
mo_delete->set( mo_delete->set(
iv_path = lv_path_a iv_path = lv_path_a
iv_val = <node_a>-value iv_val = <node_a>-value
iv_node_type = <node_a>-type ). iv_node_type = <node_a>-type ).
endcase. ENDCASE.
case <node_b>-type. CASE <node_b>-type.
when z2ui5_if_ajson_types=>node_type-array. WHEN z2ui5_if_ajson_types=>node_type-array.
mo_insert->touch_array( lv_path_b ). mo_insert->touch_array( lv_path_b ).
diff_b_a( lv_path_b ). diff_b_a( lv_path_b ).
when z2ui5_if_ajson_types=>node_type-object. WHEN z2ui5_if_ajson_types=>node_type-object.
diff_b_a( lv_path_b ). diff_b_a( lv_path_b ).
when others. WHEN OTHERS.
mo_insert->set( mo_insert->set(
iv_path = lv_path_b iv_path = lv_path_b
iv_val = <node_b>-value iv_val = <node_b>-value
iv_node_type = <node_b>-type ). iv_node_type = <node_b>-type ).
endcase. ENDCASE.
endif. ENDIF.
else. ELSE.
" save as delete " save as delete
case <node_a>-type. CASE <node_a>-type.
when z2ui5_if_ajson_types=>node_type-array. WHEN z2ui5_if_ajson_types=>node_type-array.
mo_delete->touch_array( lv_path_a ). mo_delete->touch_array( lv_path_a ).
diff_a_b( lv_path_a ). diff_a_b( lv_path_a ).
when z2ui5_if_ajson_types=>node_type-object. WHEN z2ui5_if_ajson_types=>node_type-object.
diff_a_b( lv_path_a ). diff_a_b( lv_path_a ).
when others. WHEN OTHERS.
mo_delete->set( mo_delete->set(
iv_path = lv_path_a iv_path = lv_path_a
iv_val = <node_a>-value iv_val = <node_a>-value
iv_node_type = <node_a>-type ). iv_node_type = <node_a>-type ).
endcase. ENDCASE.
endif. ENDIF.
endloop. ENDLOOP.
endmethod. ENDMETHOD.
method diff_b_a. METHOD diff_b_a.
data lv_path type string. DATA lv_path TYPE string.
field-symbols <node_b> like line of mo_json_b->mt_json_tree. FIELD-SYMBOLS <node_b> LIKE LINE OF mo_json_b->mt_json_tree.
loop at mo_json_b->mt_json_tree assigning <node_b> where path = iv_path. LOOP AT mo_json_b->mt_json_tree ASSIGNING <node_b> WHERE path = iv_path.
lv_path = <node_b>-path && <node_b>-name && '/'. lv_path = <node_b>-path && <node_b>-name && '/'.
case <node_b>-type. CASE <node_b>-type.
when z2ui5_if_ajson_types=>node_type-array. WHEN z2ui5_if_ajson_types=>node_type-array.
mo_insert->touch_array( lv_path ). mo_insert->touch_array( lv_path ).
diff_b_a( diff_b_a(
iv_path = lv_path iv_path = lv_path
iv_array = abap_true ). iv_array = abap_true ).
when z2ui5_if_ajson_types=>node_type-object. WHEN z2ui5_if_ajson_types=>node_type-object.
diff_b_a( lv_path ). diff_b_a( lv_path ).
when others. WHEN OTHERS.
if iv_array = abap_false. IF iv_array = abap_false.
read table mo_json_a->mt_json_tree transporting no fields READ TABLE mo_json_a->mt_json_tree TRANSPORTING NO FIELDS
with table key path = <node_b>-path name = <node_b>-name. WITH TABLE KEY path = <node_b>-path name = <node_b>-name.
if sy-subrc <> 0. IF sy-subrc <> 0.
" save as insert " save as insert
mo_insert->set( mo_insert->set(
iv_path = lv_path iv_path = lv_path
iv_val = <node_b>-value iv_val = <node_b>-value
iv_node_type = <node_b>-type ). iv_node_type = <node_b>-type ).
endif. ENDIF.
else. ELSE.
read table mo_insert->mt_json_tree transporting no fields READ TABLE mo_insert->mt_json_tree TRANSPORTING NO FIELDS
with key path = <node_b>-path value = <node_b>-value. WITH KEY path = <node_b>-path value = <node_b>-value.
if sy-subrc <> 0. IF sy-subrc <> 0.
" save as new array value " save as new array value
mo_insert->push( mo_insert->push(
iv_path = iv_path iv_path = iv_path
iv_val = <node_b>-value ). iv_val = <node_b>-value ).
endif. ENDIF.
endif. ENDIF.
endcase. ENDCASE.
endloop. ENDLOOP.
endmethod. ENDMETHOD.
method is_equal. METHOD is_equal.
data li_ins type ref to z2ui5_if_ajson. DATA li_ins TYPE REF TO z2ui5_if_ajson.
data li_del type ref to z2ui5_if_ajson. DATA li_del TYPE REF TO z2ui5_if_ajson.
data li_mod type ref to z2ui5_if_ajson. DATA li_mod TYPE REF TO z2ui5_if_ajson.
diff( diff(
exporting EXPORTING
iv_json_a = iv_json_a iv_json_a = iv_json_a
iv_json_b = iv_json_b iv_json_b = iv_json_b
io_json_a = ii_json_a io_json_a = ii_json_a
io_json_b = ii_json_b io_json_b = ii_json_b
importing IMPORTING
eo_insert = li_ins eo_insert = li_ins
eo_delete = li_del eo_delete = li_del
eo_change = li_mod ). eo_change = li_mod ).
rv_yes = boolc( rv_yes = boolc(
li_ins->is_empty( ) = abap_true and li_ins->is_empty( ) = abap_true AND
li_del->is_empty( ) = abap_true and li_del->is_empty( ) = abap_true AND
li_mod->is_empty( ) = abap_true ). li_mod->is_empty( ) = abap_true ).
endmethod. ENDMETHOD.
method merge. METHOD merge.
mo_json_a = normalize_input( mo_json_a = normalize_input(
iv_json = iv_json_a iv_json = iv_json_a
@ -338,34 +338,34 @@ CLASS Z2UI5_CL_AJSON_UTILITIES IMPLEMENTATION.
io_json = ro_json io_json = ro_json
iv_keep_empty_arrays = iv_keep_empty_arrays ). iv_keep_empty_arrays = iv_keep_empty_arrays ).
endmethod. ENDMETHOD.
method new. METHOD new.
create object ro_instance. CREATE OBJECT ro_instance.
endmethod. ENDMETHOD.
method normalize_input. METHOD normalize_input.
if boolc( iv_json is initial ) = boolc( io_json is initial ). IF boolc( iv_json IS INITIAL ) = boolc( io_json IS INITIAL ).
z2UI5_cx_ajson_error=>raise( 'Either supply JSON string or instance, but not both' ). z2ui5_cx_ajson_error=>raise( 'Either supply JSON string or instance, but not both' ).
endif. ENDIF.
if iv_json is not initial. IF iv_json IS NOT INITIAL.
ro_json = z2ui5_cl_ajson=>parse( iv_json ). ro_json = z2ui5_cl_ajson=>parse( iv_json ).
elseif io_json is not initial. ELSEIF io_json IS NOT INITIAL.
ro_json = io_json. ro_json = io_json.
else. ELSE.
z2UI5_cx_ajson_error=>raise( 'Supply either JSON string or instance' ). z2ui5_cx_ajson_error=>raise( 'Supply either JSON string or instance' ).
endif. ENDIF.
endmethod. ENDMETHOD.
method sort. METHOD sort.
data lo_json type ref to z2ui5_if_ajson. DATA lo_json TYPE REF TO z2ui5_if_ajson.
lo_json = normalize_input( lo_json = normalize_input(
iv_json = iv_json iv_json = iv_json
@ -374,5 +374,5 @@ CLASS Z2UI5_CL_AJSON_UTILITIES IMPLEMENTATION.
" 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 ).
endmethod. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -2,72 +2,72 @@
* UTIL * UTIL
********************************************************************** **********************************************************************
class lcl_nodes_helper definition final. CLASS lcl_nodes_helper DEFINITION FINAL.
public section. PUBLIC SECTION.
data mt_nodes type z2ui5_if_ajson_types=>ty_nodes_tt read-only. DATA mt_nodes TYPE z2ui5_if_ajson_types=>ty_nodes_tt READ-ONLY.
methods add METHODS add
importing IMPORTING
iv_str type string. iv_str TYPE string.
methods sorted METHODS sorted
returning RETURNING
value(rt_nodes) type z2ui5_if_ajson_types=>ty_nodes_ts. VALUE(rt_nodes) TYPE z2ui5_if_ajson_types=>ty_nodes_ts.
endclass. ENDCLASS.
class lcl_nodes_helper implementation. CLASS lcl_nodes_helper IMPLEMENTATION.
method add. METHOD add.
field-symbols <n> like line of mt_nodes. FIELD-SYMBOLS <n> LIKE LINE OF mt_nodes.
data lv_children type string. DATA lv_children TYPE string.
data lv_index type string. DATA lv_index TYPE string.
append initial line to mt_nodes assigning <n>. APPEND INITIAL LINE TO mt_nodes ASSIGNING <n>.
split iv_str at '|' into SPLIT iv_str AT '|' INTO
<n>-path <n>-path
<n>-name <n>-name
<n>-type <n>-type
<n>-value <n>-value
lv_index lv_index
lv_children. lv_children.
condense <n>-path. CONDENSE <n>-path.
condense <n>-name. CONDENSE <n>-name.
condense <n>-type. CONDENSE <n>-type.
condense <n>-value. CONDENSE <n>-value.
<n>-index = lv_index. <n>-index = lv_index.
<n>-children = lv_children. <n>-children = lv_children.
endmethod. ENDMETHOD.
method sorted. METHOD sorted.
rt_nodes = mt_nodes. rt_nodes = mt_nodes.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
********************************************************************** **********************************************************************
* PARSER * PARSER
********************************************************************** **********************************************************************
class ltcl_parser_test definition final CLASS ltcl_parser_test DEFINITION FINAL
for testing FOR TESTING
risk level harmless RISK LEVEL HARMLESS
duration short. DURATION SHORT.
public section. PUBLIC SECTION.
class-methods sample_json CLASS-METHODS sample_json
importing IMPORTING
iv_separator type string optional iv_separator TYPE string OPTIONAL
returning RETURNING
value(rv_json) type string. VALUE(rv_json) TYPE string.
endclass. ENDCLASS.
class ltcl_parser_test implementation. CLASS ltcl_parser_test IMPLEMENTATION.
method sample_json. METHOD sample_json.
rv_json = rv_json =
'{\n' && '{\n' &&
@ -108,46 +108,46 @@ class ltcl_parser_test implementation.
' ]\n' && ' ]\n' &&
'}'. '}'.
replace all occurrences of '\n' in rv_json with iv_separator. REPLACE ALL OCCURRENCES OF '\n' IN rv_json WITH iv_separator.
endmethod. ENDMETHOD.
endclass. ENDCLASS.
********************************************************************** **********************************************************************
* JSON UTILITIES * JSON UTILITIES
********************************************************************** **********************************************************************
class ltcl_json_utils definition CLASS ltcl_json_utils DEFINITION
for testing FOR TESTING
risk level harmless RISK LEVEL HARMLESS
duration short DURATION SHORT
final. FINAL.
private section. PRIVATE SECTION.
methods json_diff for testing raising z2UI5_cx_ajson_error. METHODS json_diff FOR TESTING RAISING z2ui5_cx_ajson_error.
methods json_diff_types for testing raising z2UI5_cx_ajson_error. METHODS json_diff_types FOR TESTING RAISING z2ui5_cx_ajson_error.
methods json_diff_arrays for testing raising z2UI5_cx_ajson_error. METHODS json_diff_arrays FOR TESTING RAISING z2ui5_cx_ajson_error.
methods json_merge for testing raising z2UI5_cx_ajson_error. METHODS json_merge FOR TESTING RAISING z2ui5_cx_ajson_error.
methods json_sort for testing raising z2UI5_cx_ajson_error. METHODS json_sort FOR TESTING RAISING z2ui5_cx_ajson_error.
methods is_equal for testing raising z2UI5_cx_ajson_error. METHODS is_equal FOR TESTING RAISING z2ui5_cx_ajson_error.
endclass. ENDCLASS.
class ltcl_json_utils implementation. CLASS ltcl_json_utils IMPLEMENTATION.
method json_diff. METHOD json_diff.
data: DATA:
lv_json type string, lv_json TYPE string,
lo_util type ref to z2ui5_cl_ajson_utilities, lo_util TYPE REF TO z2ui5_cl_ajson_utilities,
lo_insert type ref to z2ui5_if_ajson, lo_insert TYPE REF TO z2ui5_if_ajson,
lo_delete type ref to z2ui5_if_ajson, lo_delete TYPE REF TO z2ui5_if_ajson,
lo_change type ref to z2ui5_if_ajson, lo_change TYPE REF TO z2ui5_if_ajson,
lo_insert_exp type ref to lcl_nodes_helper, lo_insert_exp TYPE REF TO lcl_nodes_helper,
lo_delete_exp type ref to lcl_nodes_helper, lo_delete_exp TYPE REF TO lcl_nodes_helper,
lo_change_exp type ref to lcl_nodes_helper. lo_change_exp TYPE REF TO lcl_nodes_helper.
lv_json = lv_json =
'{\n' && '{\n' &&
@ -190,9 +190,9 @@ class ltcl_json_utils implementation.
' ]\n' && ' ]\n' &&
'}'. '}'.
replace all occurrences of '\n' in lv_json with cl_abap_char_utilities=>newline. REPLACE ALL OCCURRENCES OF '\n' IN lv_json WITH cl_abap_char_utilities=>newline.
create object lo_insert_exp. CREATE OBJECT lo_insert_exp.
lo_insert_exp->add( ' | |object | |0|3' ). lo_insert_exp->add( ' | |object | |0|3' ).
lo_insert_exp->add( '/ |boolean |str |true |0|0' ). " changed type (insert new) lo_insert_exp->add( '/ |boolean |str |true |0|0' ). " changed type (insert new)
lo_insert_exp->add( '/ |issues |array | |0|1' ). lo_insert_exp->add( '/ |issues |array | |0|1' ).
@ -201,7 +201,7 @@ class ltcl_json_utils implementation.
lo_insert_exp->add( '/issues/1/ |end |object | |0|1' ). lo_insert_exp->add( '/issues/1/ |end |object | |0|1' ).
lo_insert_exp->add( '/issues/1/end/ |new |num |1 |0|0' ). " array insert lo_insert_exp->add( '/issues/1/end/ |new |num |1 |0|0' ). " array insert
create object lo_delete_exp. CREATE OBJECT lo_delete_exp.
lo_delete_exp->add( ' | |object | |0|3' ). lo_delete_exp->add( ' | |object | |0|3' ).
lo_delete_exp->add( '/ |boolean |bool |true |0|0' ). " changed type (delete old) lo_delete_exp->add( '/ |boolean |bool |true |0|0' ). " changed type (delete old)
lo_delete_exp->add( '/ |false |bool |false |0|0' ). " delete lo_delete_exp->add( '/ |false |bool |false |0|0' ). " delete
@ -210,7 +210,7 @@ class ltcl_json_utils implementation.
lo_delete_exp->add( '/issues/1/ |end |object | |0|1' ). lo_delete_exp->add( '/issues/1/ |end |object | |0|1' ).
lo_delete_exp->add( '/issues/1/end/ |row |num |4 |0|0' ). " array delete lo_delete_exp->add( '/issues/1/end/ |row |num |4 |0|0' ). " array delete
create object lo_change_exp. CREATE OBJECT lo_change_exp.
lo_change_exp->add( ' | |object | |0|2' ). lo_change_exp->add( ' | |object | |0|2' ).
lo_change_exp->add( '/ |issues |array | |0|1' ). lo_change_exp->add( '/ |issues |array | |0|1' ).
lo_change_exp->add( '/ |number |num |789 |0|0' ). " changed value lo_change_exp->add( '/ |number |num |789 |0|0' ). " changed value
@ -218,13 +218,13 @@ class ltcl_json_utils implementation.
lo_change_exp->add( '/issues/1/ |start |object | |0|1' ). lo_change_exp->add( '/issues/1/ |start |object | |0|1' ).
lo_change_exp->add( '/issues/1/start/|row |num |5 |0|0' ). " array change lo_change_exp->add( '/issues/1/start/|row |num |5 |0|0' ). " array change
create object lo_util. CREATE OBJECT lo_util.
lo_util->diff( lo_util->diff(
exporting EXPORTING
iv_json_a = ltcl_parser_test=>sample_json( ) iv_json_a = ltcl_parser_test=>sample_json( )
iv_json_b = lv_json iv_json_b = lv_json
importing IMPORTING
eo_insert = lo_insert eo_insert = lo_insert
eo_delete = lo_delete eo_delete = lo_delete
eo_change = lo_change ). eo_change = lo_change ).
@ -241,19 +241,19 @@ class ltcl_json_utils implementation.
act = lo_change->mt_json_tree act = lo_change->mt_json_tree
exp = lo_change_exp->mt_nodes ). exp = lo_change_exp->mt_nodes ).
endmethod. ENDMETHOD.
method json_diff_types. METHOD json_diff_types.
data: DATA:
lv_json_a type string, lv_json_a TYPE string,
lv_json_b type string, lv_json_b TYPE string,
lo_util type ref to z2ui5_cl_ajson_utilities, lo_util TYPE REF TO z2ui5_cl_ajson_utilities,
lo_insert type ref to z2ui5_if_ajson, lo_insert TYPE REF TO z2ui5_if_ajson,
lo_delete type ref to z2ui5_if_ajson, lo_delete TYPE REF TO z2ui5_if_ajson,
lo_change type ref to z2ui5_if_ajson, lo_change TYPE REF TO z2ui5_if_ajson,
lo_insert_exp type ref to lcl_nodes_helper, lo_insert_exp TYPE REF TO lcl_nodes_helper,
lo_delete_exp type ref to lcl_nodes_helper. lo_delete_exp TYPE REF TO lcl_nodes_helper.
" Change single value to array " Change single value to array
lv_json_a = lv_json_a =
@ -272,27 +272,27 @@ class ltcl_json_utils implementation.
' "number": 123\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_a WITH cl_abap_char_utilities=>newline.
replace all occurrences of '\n' in lv_json_b with cl_abap_char_utilities=>newline. REPLACE ALL OCCURRENCES OF '\n' IN lv_json_b WITH cl_abap_char_utilities=>newline.
create object lo_insert_exp. CREATE OBJECT lo_insert_exp.
lo_insert_exp->add( ' | |object | |0|1' ). lo_insert_exp->add( ' | |object | |0|1' ).
lo_insert_exp->add( '/ |string |array | |0|3' ). lo_insert_exp->add( '/ |string |array | |0|3' ).
lo_insert_exp->add( '/string/ |1 |str |a |1|0' ). lo_insert_exp->add( '/string/ |1 |str |a |1|0' ).
lo_insert_exp->add( '/string/ |2 |str |b |2|0' ). lo_insert_exp->add( '/string/ |2 |str |b |2|0' ).
lo_insert_exp->add( '/string/ |3 |str |c |3|0' ). lo_insert_exp->add( '/string/ |3 |str |c |3|0' ).
create object lo_delete_exp. CREATE OBJECT lo_delete_exp.
lo_delete_exp->add( ' | |object | |0|1' ). lo_delete_exp->add( ' | |object | |0|1' ).
lo_delete_exp->add( '/ |string |str |abc |0|0' ). lo_delete_exp->add( '/ |string |str |abc |0|0' ).
create object lo_util. CREATE OBJECT lo_util.
lo_util->diff( lo_util->diff(
exporting EXPORTING
iv_json_a = lv_json_a iv_json_a = lv_json_a
iv_json_b = lv_json_b iv_json_b = lv_json_b
importing IMPORTING
eo_insert = lo_insert eo_insert = lo_insert
eo_delete = lo_delete eo_delete = lo_delete
eo_change = lo_change ). eo_change = lo_change ).
@ -311,10 +311,10 @@ class ltcl_json_utils implementation.
" Change array to single value " Change array to single value
lo_util->diff( lo_util->diff(
exporting EXPORTING
iv_json_a = lv_json_b iv_json_a = lv_json_b
iv_json_b = lv_json_a iv_json_b = lv_json_a
importing IMPORTING
eo_insert = lo_insert eo_insert = lo_insert
eo_delete = lo_delete eo_delete = lo_delete
eo_change = lo_change ). eo_change = lo_change ).
@ -331,18 +331,18 @@ class ltcl_json_utils implementation.
act = lines( lo_change->mt_json_tree ) act = lines( lo_change->mt_json_tree )
exp = 0 ). exp = 0 ).
endmethod. ENDMETHOD.
method json_diff_arrays. METHOD json_diff_arrays.
data: DATA:
lv_json_a type string, lv_json_a TYPE string,
lv_json_b type string, lv_json_b TYPE string,
lo_util type ref to z2ui5_cl_ajson_utilities, lo_util TYPE REF TO z2ui5_cl_ajson_utilities,
lo_insert type ref to z2ui5_if_ajson, lo_insert TYPE REF TO z2ui5_if_ajson,
lo_delete type ref to z2ui5_if_ajson, lo_delete TYPE REF TO z2ui5_if_ajson,
lo_change type ref to z2ui5_if_ajson, lo_change TYPE REF TO z2ui5_if_ajson,
lo_insert_exp type ref to lcl_nodes_helper. lo_insert_exp TYPE REF TO lcl_nodes_helper.
" Add empty array " Add empty array
lv_json_a = lv_json_a =
@ -356,17 +356,17 @@ class ltcl_json_utils implementation.
' "number": 123\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_a WITH cl_abap_char_utilities=>newline.
replace all occurrences of '\n' in lv_json_b 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. CREATE OBJECT lo_util.
" Empty arrays are ignored by default " Empty arrays are ignored by default
lo_util->diff( lo_util->diff(
exporting EXPORTING
iv_json_a = lv_json_a iv_json_a = lv_json_a
iv_json_b = lv_json_b iv_json_b = lv_json_b
importing IMPORTING
eo_insert = lo_insert eo_insert = lo_insert
eo_delete = lo_delete eo_delete = lo_delete
eo_change = lo_change ). eo_change = lo_change ).
@ -385,16 +385,16 @@ class ltcl_json_utils implementation.
" Keep empty arrays " Keep empty arrays
lo_util->diff( lo_util->diff(
exporting EXPORTING
iv_json_a = lv_json_a iv_json_a = lv_json_a
iv_json_b = lv_json_b iv_json_b = lv_json_b
iv_keep_empty_arrays = abap_true iv_keep_empty_arrays = abap_true
importing IMPORTING
eo_insert = lo_insert eo_insert = lo_insert
eo_delete = lo_delete eo_delete = lo_delete
eo_change = lo_change ). eo_change = lo_change ).
create object lo_insert_exp. CREATE OBJECT lo_insert_exp.
lo_insert_exp->add( ' | |object | |0|1' ). lo_insert_exp->add( ' | |object | |0|1' ).
lo_insert_exp->add( '/ |names |array | |0|0' ). lo_insert_exp->add( '/ |names |array | |0|0' ).
@ -410,16 +410,16 @@ class ltcl_json_utils implementation.
act = lines( lo_change->mt_json_tree ) act = lines( lo_change->mt_json_tree )
exp = 0 ). exp = 0 ).
endmethod. ENDMETHOD.
method json_merge. METHOD json_merge.
data: DATA:
lv_json_a type string, lv_json_a TYPE string,
lv_json_b type string, lv_json_b TYPE string,
lo_util type ref to z2ui5_cl_ajson_utilities, lo_util TYPE REF TO z2ui5_cl_ajson_utilities,
lo_merge type ref to z2ui5_if_ajson, lo_merge TYPE REF TO z2ui5_if_ajson,
lo_merge_exp type ref to lcl_nodes_helper. lo_merge_exp TYPE REF TO lcl_nodes_helper.
" Merge new value of b into a " Merge new value of b into a
lv_json_a = lv_json_a =
@ -441,10 +441,10 @@ class ltcl_json_utils implementation.
' "float": 123.45\n' && ' "float": 123.45\n' &&
'}'. '}'.
replace all occurrences of '\n' in lv_json_a with cl_abap_char_utilities=>newline. 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. REPLACE ALL OCCURRENCES OF '\n' IN lv_json_b WITH cl_abap_char_utilities=>newline.
create object lo_merge_exp. CREATE OBJECT lo_merge_exp.
lo_merge_exp->add( ' | |object | |0|3' ). lo_merge_exp->add( ' | |object | |0|3' ).
lo_merge_exp->add( '/ |float |num |123.45 |0|0' ). lo_merge_exp->add( '/ |float |num |123.45 |0|0' ).
lo_merge_exp->add( '/ |number |num |123 |0|0' ). lo_merge_exp->add( '/ |number |num |123 |0|0' ).
@ -453,7 +453,7 @@ class ltcl_json_utils implementation.
lo_merge_exp->add( '/string/ |2 |str |c |2|0' ). lo_merge_exp->add( '/string/ |2 |str |c |2|0' ).
lo_merge_exp->add( '/string/ |3 |str |b |3|0' ). lo_merge_exp->add( '/string/ |3 |str |b |3|0' ).
create object lo_util. CREATE OBJECT lo_util.
lo_merge = lo_util->merge( lo_merge = lo_util->merge(
iv_json_a = lv_json_a iv_json_a = lv_json_a
@ -463,15 +463,15 @@ class ltcl_json_utils implementation.
act = lo_merge->mt_json_tree act = lo_merge->mt_json_tree
exp = lo_merge_exp->mt_nodes ). exp = lo_merge_exp->mt_nodes ).
endmethod. ENDMETHOD.
method json_sort. METHOD json_sort.
data: DATA:
lv_json type string, lv_json TYPE string,
lo_util type ref to z2ui5_cl_ajson_utilities, lo_util TYPE REF TO z2ui5_cl_ajson_utilities,
lv_sorted type string, lv_sorted TYPE string,
lv_sorted_exp type string. lv_sorted_exp TYPE string.
lv_json = lv_json =
'{\n' && '{\n' &&
@ -485,7 +485,7 @@ class ltcl_json_utils implementation.
' "date": "2020-03-15"\n' && ' "date": "2020-03-15"\n' &&
'}'. '}'.
replace all occurrences of '\n' in lv_json with cl_abap_char_utilities=>newline. REPLACE ALL OCCURRENCES OF '\n' IN lv_json WITH cl_abap_char_utilities=>newline.
lv_sorted_exp = lv_sorted_exp =
'{\n' && '{\n' &&
@ -499,9 +499,9 @@ class ltcl_json_utils implementation.
' "true": true\n' && ' "true": true\n' &&
'}'. '}'.
replace all occurrences of '\n' in lv_sorted_exp with cl_abap_char_utilities=>newline. REPLACE ALL OCCURRENCES OF '\n' IN lv_sorted_exp WITH cl_abap_char_utilities=>newline.
create object lo_util. CREATE OBJECT lo_util.
lv_sorted = lo_util->sort( iv_json = lv_json ). lv_sorted = lo_util->sort( iv_json = lv_json ).
@ -509,9 +509,9 @@ class ltcl_json_utils implementation.
act = lv_sorted act = lv_sorted
exp = lv_sorted_exp ). exp = lv_sorted_exp ).
endmethod. ENDMETHOD.
method is_equal. METHOD is_equal.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
act = z2ui5_cl_ajson_utilities=>new( )->is_equal( act = z2ui5_cl_ajson_utilities=>new( )->is_equal(
@ -543,6 +543,6 @@ class ltcl_json_utils implementation.
iv_json_b = '{"a":1,"b":2}' ) iv_json_b = '{"a":1,"b":2}' )
exp = abap_false ). exp = abap_false ).
endmethod. ENDMETHOD.
endclass. ENDCLASS.

View File

@ -1,4 +1,4 @@
class Z2UI5_CX_AJSON_ERROR definition class z2ui5_cx_ajson_error definition
public public
inheriting from CX_STATIC_CHECK inheriting from CX_STATIC_CHECK
final final
@ -45,7 +45,7 @@ public section.
!IV_LOCATION type STRING optional !IV_LOCATION type STRING optional
!IS_NODE type ANY optional !IS_NODE type ANY optional
raising raising
Z2UI5_CX_AJSON_ERROR . z2ui5_cx_ajson_error .
methods SET_LOCATION methods SET_LOCATION
importing importing
!IV_LOCATION type STRING optional !IV_LOCATION type STRING optional
@ -64,10 +64,10 @@ ENDCLASS.
CLASS Z2UI5_CX_AJSON_ERROR IMPLEMENTATION. CLASS z2ui5_cx_ajson_error IMPLEMENTATION.
method CONSTRUCTOR ##ADT_SUPPRESS_GENERATION. method CONSTRUCTOR.
CALL METHOD SUPER->CONSTRUCTOR CALL METHOD SUPER->CONSTRUCTOR
EXPORTING EXPORTING
PREVIOUS = PREVIOUS PREVIOUS = PREVIOUS

View File

@ -20,7 +20,9 @@ class ltcl_error implementation.
data lx type ref to z2ui5_cx_ajson_error. data lx type ref to z2ui5_cx_ajson_error.
data lv_msg type string. data lv_msg type string.
lv_msg = repeat( val = 'a' occ = 50 ) && repeat( val = 'b' occ = 50 ) && '123'. lv_msg = repeat( val = 'a'
occ = 50 ) && repeat( val = 'b'
occ = 50 ) && '123'.
try. try.
z2ui5_cx_ajson_error=>raise( lv_msg ). z2ui5_cx_ajson_error=>raise( lv_msg ).
@ -38,7 +40,8 @@ class ltcl_error implementation.
data lx type ref to z2ui5_cx_ajson_error. data lx type ref to z2ui5_cx_ajson_error.
try. try.
z2ui5_cx_ajson_error=>raise( iv_msg = 'a' iv_location = 'b' ). z2ui5_cx_ajson_error=>raise( iv_msg = 'a'
iv_location = 'b' ).
cl_abap_unit_assert=>fail( ). cl_abap_unit_assert=>fail( ).
catch z2ui5_cx_ajson_error into lx. catch z2ui5_cx_ajson_error into lx.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
@ -57,7 +60,8 @@ class ltcl_error implementation.
ls_node-name = 'y'. ls_node-name = 'y'.
try. try.
z2ui5_cx_ajson_error=>raise( iv_msg = 'a' is_node = ls_node ). z2ui5_cx_ajson_error=>raise( iv_msg = 'a'
is_node = ls_node ).
cl_abap_unit_assert=>fail( ). cl_abap_unit_assert=>fail( ).
catch z2ui5_cx_ajson_error into lx. catch z2ui5_cx_ajson_error into lx.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
@ -72,7 +76,8 @@ class ltcl_error implementation.
data lx type ref to z2ui5_cx_ajson_error. data lx type ref to z2ui5_cx_ajson_error.
try. try.
z2ui5_cx_ajson_error=>raise( iv_msg = 'a' iv_location = 'b' ). z2ui5_cx_ajson_error=>raise( iv_msg = 'a'
iv_location = 'b' ).
cl_abap_unit_assert=>fail( ). cl_abap_unit_assert=>fail( ).
catch z2ui5_cx_ajson_error into lx. catch z2ui5_cx_ajson_error into lx.
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(

View File

@ -1,262 +1,262 @@
interface z2ui5_if_ajson INTERFACE z2ui5_if_ajson
public. PUBLIC.
constants version type string value 'v1.1.9'. "#EC NOTEXT CONSTANTS version TYPE string VALUE 'v1.1.10'. "#EC NOTEXT
constants origin type string value 'https://github.com/sbcgua/ajson'. "#EC NOTEXT CONSTANTS origin TYPE string VALUE 'https://github.com/sbcgua/ajson'. "#EC NOTEXT
constants license type string value 'MIT'. "#EC NOTEXT CONSTANTS license TYPE string VALUE 'MIT'. "#EC NOTEXT
types: TYPES:
begin of ty_opts, BEGIN OF ty_opts,
read_only type abap_bool, read_only TYPE abap_bool,
keep_item_order type abap_bool, keep_item_order TYPE abap_bool,
format_datetime type abap_bool, format_datetime TYPE abap_bool,
to_abap_corresponding_only type abap_bool, to_abap_corresponding_only TYPE abap_bool,
end of ty_opts. END OF ty_opts.
" DATA " DATA
data mt_json_tree type z2ui5_if_ajson_types=>ty_nodes_ts read-only. DATA mt_json_tree TYPE z2ui5_if_ajson_types=>ty_nodes_ts READ-ONLY.
" CLONING " CLONING
methods clone METHODS clone
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods filter METHODS filter
importing IMPORTING
ii_filter type ref to z2ui5_if_ajson_filter ii_filter TYPE REF TO z2ui5_if_ajson_filter
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods map METHODS map
importing IMPORTING
ii_mapper type ref to z2ui5_if_ajson_mapping ii_mapper TYPE REF TO z2ui5_if_ajson_mapping
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
" METHODS " METHODS
methods freeze. METHODS freeze.
methods keep_item_order METHODS keep_item_order
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson. VALUE(ri_json) TYPE REF TO z2ui5_if_ajson.
methods format_datetime METHODS format_datetime
importing IMPORTING
iv_use_iso type abap_bool default abap_true iv_use_iso TYPE abap_bool DEFAULT abap_true
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson. VALUE(ri_json) TYPE REF TO z2ui5_if_ajson.
methods to_abap_corresponding_only METHODS to_abap_corresponding_only
importing IMPORTING
iv_enable type abap_bool default abap_true iv_enable TYPE abap_bool DEFAULT abap_true
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson. VALUE(ri_json) TYPE REF TO z2ui5_if_ajson.
methods opts METHODS opts
returning RETURNING
value(rs_opts) type ty_opts. VALUE(rs_opts) TYPE ty_opts.
" METHODS ex.reader " METHODS ex.reader
methods is_empty METHODS is_empty
returning RETURNING
value(rv_yes) type abap_bool. VALUE(rv_yes) TYPE abap_bool.
methods exists METHODS exists
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_exists) type abap_bool. VALUE(rv_exists) TYPE abap_bool.
methods members METHODS members
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rt_members) type string_table. VALUE(rt_members) TYPE string_table.
methods get METHODS get
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_value) type string. VALUE(rv_value) TYPE string.
methods get_node_type METHODS get_node_type
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_node_type) type z2ui5_if_ajson_types=>ty_node_type. VALUE(rv_node_type) TYPE z2ui5_if_ajson_types=>ty_node_type.
methods get_boolean METHODS get_boolean
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_value) type abap_bool. VALUE(rv_value) TYPE abap_bool.
methods get_integer METHODS get_integer
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_value) type i. VALUE(rv_value) TYPE i.
methods get_number METHODS get_number
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_value) type f. VALUE(rv_value) TYPE f.
methods get_date METHODS get_date
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_value) type d. VALUE(rv_value) TYPE d.
methods get_timestamp METHODS get_timestamp
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_value) type timestamp. VALUE(rv_value) TYPE timestamp.
methods get_string METHODS get_string
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rv_value) type string. VALUE(rv_value) TYPE string.
methods slice METHODS slice
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson. VALUE(ri_json) TYPE REF TO z2ui5_if_ajson.
methods to_abap METHODS to_abap
importing IMPORTING
iv_corresponding type abap_bool default abap_false iv_corresponding TYPE abap_bool DEFAULT abap_false
exporting EXPORTING
ev_container type any ev_container TYPE any
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods array_to_string_table METHODS array_to_string_table
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(rt_string_table) type string_table VALUE(rt_string_table) TYPE string_table
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
" METHODS ex.writer " METHODS ex.writer
methods clear METHODS clear
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods set METHODS set
importing IMPORTING
iv_path type string iv_path TYPE string
iv_val type any iv_val TYPE any
iv_ignore_empty type abap_bool default abap_true iv_ignore_empty TYPE abap_bool DEFAULT abap_true
iv_node_type type z2ui5_if_ajson_types=>ty_node_type optional iv_node_type TYPE z2ui5_if_ajson_types=>ty_node_type OPTIONAL
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods setx METHODS setx
importing IMPORTING
iv_param type string iv_param TYPE string
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods set_boolean METHODS set_boolean
importing IMPORTING
iv_path type string iv_path TYPE string
iv_val type any iv_val TYPE any
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods set_string METHODS set_string
importing IMPORTING
iv_path type string iv_path TYPE string
iv_val type clike iv_val TYPE clike
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods set_integer METHODS set_integer
importing IMPORTING
iv_path type string iv_path TYPE string
iv_val type i iv_val TYPE i
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods set_date METHODS set_date
importing IMPORTING
iv_path type string iv_path TYPE string
iv_val type d iv_val TYPE d
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods set_timestamp METHODS set_timestamp
importing IMPORTING
iv_path type string iv_path TYPE string
iv_val type timestamp iv_val TYPE timestamp
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods set_null METHODS set_null
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods delete METHODS delete
importing IMPORTING
iv_path type string iv_path TYPE string
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods touch_array METHODS touch_array
importing IMPORTING
iv_path type string iv_path TYPE string
iv_clear type abap_bool default abap_false iv_clear TYPE abap_bool DEFAULT abap_false
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods push METHODS push
importing IMPORTING
iv_path type string iv_path TYPE string
iv_val type any iv_val TYPE any
returning RETURNING
value(ri_json) type ref to z2ui5_if_ajson VALUE(ri_json) TYPE REF TO z2ui5_if_ajson
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
methods stringify METHODS stringify
importing IMPORTING
iv_indent type i default 0 iv_indent TYPE i DEFAULT 0
returning RETURNING
value(rv_json) type string VALUE(rv_json) TYPE string
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
endinterface. ENDINTERFACE.

View File

@ -1,23 +1,23 @@
interface z2ui5_if_ajson_filter INTERFACE z2ui5_if_ajson_filter
public. PUBLIC.
types ty_filter_tab TYPE STANDARD TABLE OF ref to z2ui5_if_ajson_filter with key table_line. TYPES ty_filter_tab TYPE STANDARD TABLE OF REF TO z2ui5_if_ajson_filter WITH KEY table_line.
types ty_visit_type type i. TYPES ty_visit_type TYPE i.
constants: CONSTANTS:
begin of visit_type, BEGIN OF visit_type,
value type ty_visit_type value 0, value TYPE ty_visit_type VALUE 0,
open type ty_visit_type value 1, open TYPE ty_visit_type VALUE 1,
close type ty_visit_type value 2, close TYPE ty_visit_type VALUE 2,
end of visit_type. END OF visit_type.
methods keep_node METHODS keep_node
importing IMPORTING
is_node type z2ui5_if_ajson_types=>ty_node is_node TYPE z2ui5_if_ajson_types=>ty_node
iv_visit type ty_visit_type default visit_type-value iv_visit TYPE ty_visit_type DEFAULT visit_type-value
returning RETURNING
value(rv_keep) type abap_bool VALUE(rv_keep) TYPE abap_bool
raising RAISING
z2UI5_cx_ajson_error. z2ui5_cx_ajson_error.
endinterface. ENDINTERFACE.

View File

@ -1,8 +1,6 @@
INTERFACE z2ui5_if_ajson_mapping INTERFACE z2ui5_if_ajson_mapping
PUBLIC. PUBLIC.
INTERFACES if_serializable_object.
TYPES: TYPES:
BEGIN OF ty_mapping_field, " deprecated, will be removed BEGIN OF ty_mapping_field, " deprecated, will be removed
abap TYPE string, abap TYPE string,

View File

@ -1,41 +1,41 @@
interface z2ui5_if_ajson_types INTERFACE z2ui5_if_ajson_types
public. PUBLIC.
types: TYPES:
ty_node_type type string. ty_node_type TYPE string.
constants: CONSTANTS:
begin of node_type, BEGIN OF node_type,
boolean type ty_node_type value 'bool', boolean TYPE ty_node_type VALUE 'bool',
string type ty_node_type value 'str', string TYPE ty_node_type VALUE 'str',
number type ty_node_type value 'num', number TYPE ty_node_type VALUE 'num',
null type ty_node_type value 'null', null TYPE ty_node_type VALUE 'null',
array type ty_node_type value 'array', array TYPE ty_node_type VALUE 'array',
object type ty_node_type value 'object', object TYPE ty_node_type VALUE 'object',
end of node_type. END OF node_type.
types: TYPES:
begin of ty_node, BEGIN OF ty_node,
path type string, path TYPE string,
name type string, name TYPE string,
type type ty_node_type, type TYPE ty_node_type,
value type string, value TYPE string,
index type i, index TYPE i,
order type i, order TYPE i,
children type i, children TYPE i,
end of ty_node. END OF ty_node.
types: TYPES:
ty_nodes_tt TYPE STANDARD TABLE OF ty_node with key path name. ty_nodes_tt TYPE STANDARD TABLE OF ty_node WITH KEY path name.
types: TYPES:
ty_nodes_ts type sorted table of ty_node ty_nodes_ts TYPE SORTED TABLE OF ty_node
with unique key path name WITH UNIQUE KEY path name
with non-unique sorted key array_index components path index WITH NON-UNIQUE SORTED KEY array_index COMPONENTS path index
with non-unique sorted key item_order components path order. WITH NON-UNIQUE SORTED KEY item_order COMPONENTS path order.
types: TYPES:
begin of ty_path_name, BEGIN OF ty_path_name,
path type string, path TYPE string,
name type string, name TYPE string,
end of ty_path_name. END OF ty_path_name.
endinterface. ENDINTERFACE.