11CLASS z2ui5_cl_ajson DEFINITION
22 PUBLIC
3- CREATE PUBLIC .
3+ CREATE PUBLIC .
44
55 PUBLIC SECTION .
66
7- INTERFACES z2ui5_if_ajson .
7+ INTERFACES z2ui5_if_ajson.
88
99 ALIASES :
1010 is_empty FOR z2ui5_if_ajson~is_empty,
@@ -57,7 +57,7 @@ CLASS z2ui5_cl_ajson DEFINITION
5757 RETURNING
5858 VALUE (ro_instance ) TYPE REF TO z2ui5_cl_ajson
5959 RAISING
60- z2ui5_cx_ajson_error .
60+ z2ui5_cx_ajson_error.
6161
6262 CLASS-METHODS create_empty " Might be deprecated, prefer using new( ) or create object
6363 IMPORTING
@@ -77,13 +77,14 @@ CLASS z2ui5_cl_ajson DEFINITION
7777 RETURNING
7878 VALUE (ro_instance ) TYPE REF TO z2ui5_cl_ajson
7979 RAISING
80- z2ui5_cx_ajson_error .
80+ z2ui5_cx_ajson_error.
8181
8282 METHODS constructor
8383 IMPORTING
8484 iv_keep_item_order TYPE abap_bool DEFAULT abap_false
8585 iv_format_datetime TYPE abap_bool DEFAULT abap_true
8686 iv_to_abap_corresponding_only TYPE abap_bool DEFAULT abap_false .
87+
8788 CLASS-METHODS new
8889 IMPORTING
8990 iv_keep_item_order TYPE abap_bool DEFAULT abap_false
@@ -92,6 +93,12 @@ CLASS z2ui5_cl_ajson DEFINITION
9293 RETURNING
9394 VALUE (ro_instance ) TYPE REF TO z2ui5_cl_ajson.
9495
96+ CLASS-METHODS normalize_path
97+ IMPORTING
98+ iv_path TYPE string
99+ RETURNING
100+ VALUE (rv_path ) TYPE string .
101+
95102 PROTECTED SECTION .
96103
97104 PRIVATE SECTION .
@@ -188,14 +195,14 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
188195 DATA lr_parent LIKE ir_parent.
189196
190197 READ TABLE mt_json_tree INTO rs_top_node
191- WITH KEY
198+ WITH TABLE KEY
192199 path = iv_path
193200 name = iv_name.
194201 IF sy -subrc <> 0 .
195202 RETURN . " Not found ? nothing to delete !
196203 ENDIF .
197204
198- DELETE mt_json_tree INDEX sy -tabix . " where path = iv_path and name = iv_name.
205+ DELETE mt_json_tree INDEX sy -tabix . "#EC CI_SORTSEQ where path = iv_path and name = iv_name.
199206
200207 IF rs_top_node-children > 0 . " only for objects and arrays
201208 lv_parent_path = iv_path && iv_name && '/*' .
@@ -217,18 +224,14 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
217224
218225 METHOD get_item .
219226
220- FIELD-SYMBOLS <item> LIKE LINE OF mt_json_tree.
221227 DATA ls_path_name TYPE z2ui5_if_ajson_types=>ty_path_name.
222228 ls_path_name = lcl_utils=>split_path( iv_path ).
223229
224230 READ TABLE mt_json_tree
225- ASSIGNING <item>
231+ REFERENCE INTO rv_item
226232 WITH KEY
227233 path = ls_path_name-path
228234 name = ls_path_name-name.
229- IF sy -subrc = 0 .
230- GET REFERENCE OF <item> INTO rv_item.
231- ENDIF .
232235
233236 ENDMETHOD .
234237
@@ -242,6 +245,11 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
242245 ENDMETHOD .
243246
244247
248+ METHOD normalize_path .
249+ rv_path = lcl_utils=>normalize_path( iv_path ).
250+ ENDMETHOD .
251+
252+
245253 METHOD parse .
246254
247255 DATA lo_parser TYPE REF TO lcl_json_parser.
@@ -275,7 +283,7 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
275283 DO .
276284 lr_node_parent = rr_end_node.
277285 READ TABLE mt_json_tree REFERENCE INTO rr_end_node
278- WITH KEY
286+ WITH TABLE KEY
279287 path = lv_cur_path
280288 name = lv_cur_name.
281289 IF sy -subrc <> 0 . " New node, assume it is always object as it has a named child, use touch_array to init array
@@ -439,7 +447,7 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
439447 IF lr_item IS NOT INITIAL AND lr_item->type = z2ui5_if_ajson_types=>node_type-string.
440448 FIND FIRST OCCURRENCE OF REGEX '^(\d{4})-(\d{2})-(\d{2})(T|$)'
441449 IN lr_item->value
442- SUBMATCHES lv_y lv_m lv_d.
450+ SUBMATCHES lv_y lv_m lv_d ##REGEX_POSIX .
443451 CONCATENATE lv_y lv_m lv_d INTO rv_value.
444452 ENDIF .
445453
@@ -512,6 +520,28 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
512520 ENDMETHOD .
513521
514522
523+ METHOD z2ui5_if_ajson ~get_timestampl .
524+
525+ DATA lo_to_abap TYPE REF TO lcl_json_to_abap.
526+ DATA lr_item TYPE REF TO z2ui5_if_ajson_types=>ty_node.
527+
528+ lr_item = get_item( iv_path ).
529+
530+ IF lr_item IS INITIAL .
531+ RETURN .
532+ ENDIF .
533+
534+ CREATE OBJECT lo_to_abap.
535+
536+ TRY .
537+ rv_value = lo_to_abap->to_timestampl( lr_item->value ).
538+ CATCH z2ui5_cx_ajson_error.
539+ RETURN .
540+ ENDTRY .
541+
542+ ENDMETHOD .
543+
544+
515545 METHOD z2ui5_if_ajson ~is_empty .
516546 rv_yes = boolc ( lines ( mt_json_tree ) = 0 ).
517547 ENDMETHOD .
@@ -706,7 +736,7 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
706736 ENDIF .
707737
708738 IF go_float_regex IS NOT BOUND .
709- CREATE OBJECT go_float_regex EXPORTING pattern = '^([1-9][0-9]*|0)\.[0-9]+$' .
739+ CREATE OBJECT go_float_regex EXPORTING pattern = '^([1-9][0-9]*|0)\.[0-9]+$' ##REGEX_POSIX .
710740 " expects fractional, because ints are detected separately
711741 ENDIF .
712742
@@ -838,8 +868,28 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
838868 ENDMETHOD .
839869
840870
871+ METHOD z2ui5_if_ajson ~set_timestampl .
872+
873+ ri_json = me .
874+
875+ DATA lv_timestamp_iso TYPE string .
876+ lv_timestamp_iso = lcl_abap_to_json=>format_timestampl( iv_val ).
877+
878+ z2ui5_if_ajson~set(
879+ iv_ignore_empty = abap_false
880+ iv_path = iv_path
881+ iv_val = lv_timestamp_iso ).
882+
883+ ENDMETHOD .
884+
885+
841886 METHOD z2ui5_if_ajson ~slice .
842887
888+ " TODO: idea
889+ " read only mode (for read only jsons or a param)
890+ " which would reuse the original tree, so copy a reference of the tree, presuming that it is not changed
891+ " this will be faster, in particular for array iterations
892+
843893 DATA lo_section TYPE REF TO z2ui5_cl_ajson.
844894 DATA ls_item LIKE LINE OF mt_json_tree.
845895 DATA lv_normalized_path TYPE string .
@@ -865,7 +915,7 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
865915
866916 lv_path_pattern = lv_normalized_path && `*` .
867917
868- LOOP AT mt_json_tree INTO ls_item WHERE path CP lv_path_pattern.
918+ LOOP AT mt_json_tree INTO ls_item WHERE path CP lv_path_pattern. "#EC CI_SORTSEQ
869919
870920 ls_item-path = substring ( val = ls_item-path
871921 off = lv_path_len - 1 ). " less closing '/'
@@ -953,7 +1003,8 @@ CLASS z2ui5_cl_ajson IMPLEMENTATION.
9531003 CREATE OBJECT lo_to_abap
9541004 EXPORTING
9551005 iv_corresponding = boolc ( iv_corresponding = abap_true OR ms_opts-to_abap_corresponding_only = abap_true )
956- ii_custom_mapping = mi_custom_mapping.
1006+ ii_custom_mapping = mi_custom_mapping
1007+ ii_refs_initiator = ii_refs_initiator.
9571008
9581009 lo_to_abap->to_abap(
9591010 EXPORTING
0 commit comments