Skip to content

Commit 4d7c390

Browse files
committed
Initial version
1 parent c37c070 commit 4d7c390

File tree

6 files changed

+324
-1
lines changed

6 files changed

+324
-1
lines changed

.abapgit.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
33
<asx:values>
44
<DATA>
5+
<NAME>ajson-extensions</NAME>
56
<MASTER_LANGUAGE>E</MASTER_LANGUAGE>
67
<STARTING_FOLDER>/src/</STARTING_FOLDER>
78
<FOLDER_LOGIC>PREFIX</FOLDER_LOGIC>
89
<REQUIREMENTS>
910
<item>
1011
<COMPONENT>SAP_BASIS</COMPONENT>
11-
<MIN_RELEASE>750</MIN_RELEASE>
12+
<MIN_RELEASE>702</MIN_RELEASE>
1213
</item>
1314
</REQUIREMENTS>
15+
<VERSION_CONSTANT>ZCL_AJSON_EXTENSIONS=&gt;C_VERSION</VERSION_CONSTANT>
1416
</DATA>
1517
</asx:values>
1618
</asx:abap>

src/package.devc.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<DEVC>
6+
<CTEXT>Extensions for AJSON</CTEXT>
7+
</DEVC>
8+
</asx:values>
9+
</asx:abap>
10+
</abapGit>

src/zcl_ajson_extensions.clas.abap

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
CLASS zcl_ajson_extensions DEFINITION
2+
PUBLIC
3+
FINAL
4+
CREATE PUBLIC.
5+
6+
************************************************************************
7+
* Extensions for AJSON (Filter, Mappings, etc.)
8+
*
9+
* Copyright 2025 apm.to Inc. <https://apm.to>
10+
* SPDX-License-Identifier: MIT
11+
************************************************************************
12+
PUBLIC SECTION.
13+
14+
CONSTANTS c_version TYPE string VALUE '1.0.0'.
15+
16+
"! Like zcl_ajson_mapping=>create_to_camel_case( ) but keep any leading underscore
17+
"! and first characters after it in lower case
18+
"!
19+
"! Examples:
20+
"! _ID -> _id
21+
"! _ABAP_VERSION -> _abapVersion
22+
"! DEV_DEPENDENCIES -> devDependencies
23+
CLASS-METHODS to_camel_case_underscore
24+
RETURNING
25+
VALUE(result) TYPE REF TO zif_ajson_mapping.
26+
27+
"! Like zcl_ajson_mapping=>create_camel_case( ) but keep any leading underscore
28+
"!
29+
"! Examples:
30+
"! _id -> _ID
31+
"! _abapVersion -> _ABAP_VERSION
32+
"! devDependencies -> DEV_DEPENDENCIES
33+
CLASS-METHODS from_camel_case_underscore
34+
RETURNING
35+
VALUE(result) TYPE REF TO zif_ajson_mapping.
36+
37+
"! Like zcl_ajson_filter_lib=>create_empty_filter( ) but also remove initial numbers and null
38+
CLASS-METHODS filter_empty_zero_null
39+
RETURNING
40+
VALUE(result) TYPE REF TO zif_ajson_filter.
41+
42+
PROTECTED SECTION.
43+
PRIVATE SECTION.
44+
ENDCLASS.
45+
46+
47+
48+
CLASS zcl_ajson_extensions IMPLEMENTATION.
49+
50+
51+
METHOD filter_empty_zero_null.
52+
CREATE OBJECT result TYPE lcl_empty_zero_null.
53+
ENDMETHOD.
54+
55+
56+
METHOD from_camel_case_underscore.
57+
CREATE OBJECT result TYPE lcl_from_camel_case_underscore.
58+
ENDMETHOD.
59+
60+
61+
METHOD to_camel_case_underscore.
62+
CREATE OBJECT result TYPE lcl_to_camel_case_underscore.
63+
ENDMETHOD.
64+
ENDCLASS.
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
"
2+
" MAPPINGS
3+
"
4+
CLASS lcl_to_camel_case_underscore DEFINITION.
5+
PUBLIC SECTION.
6+
INTERFACES zif_ajson_mapping.
7+
ENDCLASS.
8+
9+
CLASS lcl_to_camel_case_underscore IMPLEMENTATION.
10+
11+
METHOD zif_ajson_mapping~rename_node.
12+
13+
TYPES ty_token TYPE c LENGTH 255.
14+
15+
DATA from TYPE i.
16+
DATA tokens TYPE STANDARD TABLE OF ty_token WITH KEY table_line.
17+
18+
FIELD-SYMBOLS <token> LIKE LINE OF tokens.
19+
20+
TRANSLATE cv_name TO LOWER CASE.
21+
22+
from = 2.
23+
IF cv_name(1) = '_'.
24+
from = 3.
25+
ENDIF.
26+
27+
SPLIT cv_name AT '_' INTO TABLE tokens.
28+
29+
LOOP AT tokens ASSIGNING <token> FROM from.
30+
TRANSLATE <token>+0(1) TO UPPER CASE.
31+
ENDLOOP.
32+
33+
CONCATENATE LINES OF tokens INTO cv_name.
34+
35+
IF from = 3.
36+
cv_name = '_' && cv_name.
37+
ENDIF.
38+
39+
TRANSLATE cv_name USING '/_:_~_*_'.
40+
41+
ENDMETHOD.
42+
43+
METHOD zif_ajson_mapping~to_abap. " deprecated
44+
ASSERT 0 = 0.
45+
ENDMETHOD.
46+
47+
METHOD zif_ajson_mapping~to_json. " deprecated
48+
ASSERT 0 = 0.
49+
ENDMETHOD.
50+
51+
ENDCLASS.
52+
53+
CLASS lcl_from_camel_case_underscore DEFINITION.
54+
PUBLIC SECTION.
55+
INTERFACES zif_ajson_mapping.
56+
ENDCLASS.
57+
58+
CLASS lcl_from_camel_case_underscore IMPLEMENTATION.
59+
60+
METHOD zif_ajson_mapping~rename_node.
61+
REPLACE ALL OCCURRENCES OF REGEX `([a-z])([A-Z])` IN cv_name WITH `$1_$2`. "#EC NOTEXT
62+
TRANSLATE cv_name TO UPPER CASE.
63+
ENDMETHOD.
64+
65+
METHOD zif_ajson_mapping~to_abap. " deprecated
66+
ASSERT 0 = 0.
67+
ENDMETHOD.
68+
69+
METHOD zif_ajson_mapping~to_json. " deprecated
70+
ASSERT 0 = 0.
71+
ENDMETHOD.
72+
73+
ENDCLASS.
74+
"
75+
" FILTERS
76+
"
77+
CLASS lcl_empty_zero_null DEFINITION FINAL.
78+
PUBLIC SECTION.
79+
INTERFACES zif_ajson_filter.
80+
ENDCLASS.
81+
82+
CLASS lcl_empty_zero_null IMPLEMENTATION.
83+
84+
METHOD zif_ajson_filter~keep_node.
85+
86+
rv_keep = boolc(
87+
( iv_visit = zif_ajson_filter=>visit_type-value AND
88+
( is_node-type = zif_ajson_types=>node_type-string AND is_node-value IS NOT INITIAL OR
89+
is_node-type = zif_ajson_types=>node_type-boolean OR
90+
is_node-type = zif_ajson_types=>node_type-number AND is_node-value <> 0 ) ) OR
91+
( iv_visit <> zif_ajson_filter=>visit_type-value AND is_node-children > 0 ) ).
92+
93+
ENDMETHOD.
94+
95+
ENDCLASS.
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
CLASS ltcl_ajson_libs DEFINITION FINAL FOR TESTING
2+
DURATION SHORT
3+
RISK LEVEL HARMLESS.
4+
5+
PRIVATE SECTION.
6+
7+
TYPES:
8+
BEGIN OF ty_test,
9+
a_b TYPE i,
10+
_bb_c TYPE i,
11+
cc_dd TYPE i,
12+
_zz TYPE i,
13+
END OF ty_test.
14+
15+
DATA:
16+
abap_test TYPE ty_test,
17+
json_test TYPE string.
18+
19+
METHODS:
20+
setup,
21+
to_camel_case_underscore FOR TESTING RAISING zcx_ajson_error,
22+
from_camel_case_underscore FOR TESTING RAISING zcx_ajson_error,
23+
empty_zero_null_simple FOR TESTING RAISING zcx_ajson_error,
24+
empty_zero_null_deep FOR TESTING RAISING zcx_ajson_error.
25+
26+
ENDCLASS.
27+
28+
29+
CLASS ltcl_ajson_libs IMPLEMENTATION.
30+
31+
METHOD setup.
32+
33+
abap_test-a_b = 1.
34+
abap_test-_bb_c = 2.
35+
abap_test-cc_dd = 3.
36+
abap_test-_zz = 4.
37+
38+
json_test = '{"aB":1,"_bbC":2,"ccDd":3,"_zz":4}'.
39+
40+
ENDMETHOD.
41+
42+
"
43+
" MAPPINGS
44+
"
45+
METHOD to_camel_case_underscore.
46+
47+
DATA json_result TYPE string.
48+
49+
json_result = zcl_ajson=>new(
50+
)->keep_item_order(
51+
)->set(
52+
iv_path = '/'
53+
iv_val = abap_test
54+
)->map( zcl_ajson_extensions=>to_camel_case_underscore( )
55+
)->stringify( ).
56+
57+
cl_abap_unit_assert=>assert_equals(
58+
act = json_result
59+
exp = json_test ).
60+
61+
ENDMETHOD.
62+
63+
METHOD from_camel_case_underscore.
64+
65+
DATA abap_result TYPE ty_test.
66+
67+
zcl_ajson=>parse( json_test
68+
)->map( zcl_ajson_extensions=>from_camel_case_underscore( )
69+
)->to_abap( IMPORTING ev_container = abap_result ).
70+
71+
cl_abap_unit_assert=>assert_equals(
72+
act = abap_result
73+
exp = abap_test ).
74+
75+
ENDMETHOD.
76+
"
77+
" FILTERS
78+
"
79+
METHOD empty_zero_null_simple.
80+
81+
DATA:
82+
test TYPE REF TO zif_ajson,
83+
act TYPE REF TO zif_ajson.
84+
85+
test = zcl_ajson=>create_empty(
86+
)->set(
87+
iv_path = '/a'
88+
iv_val = '1'
89+
)->set(
90+
iv_path = '/b'
91+
iv_val = ''
92+
)->set_null( '/c'
93+
)->set(
94+
iv_path = '/d'
95+
iv_val = 0 ).
96+
97+
act = zcl_ajson=>create_from(
98+
ii_source_json = test
99+
ii_filter = zcl_ajson_extensions=>filter_empty_zero_null( ) ).
100+
101+
cl_abap_unit_assert=>assert_equals(
102+
act = act->stringify( )
103+
exp = '{"a":"1"}' ).
104+
105+
ENDMETHOD.
106+
107+
METHOD empty_zero_null_deep.
108+
109+
DATA:
110+
test TYPE REF TO zif_ajson,
111+
act TYPE REF TO zif_ajson.
112+
113+
test = zcl_ajson=>create_empty(
114+
)->set(
115+
iv_path = '/a'
116+
iv_val = '1'
117+
)->set(
118+
iv_path = '/b/c'
119+
iv_val = ''
120+
)->set_null( '/b/d'
121+
)->set(
122+
iv_path = '/d/e'
123+
iv_val = 0 ).
124+
125+
act = zcl_ajson=>create_from(
126+
ii_source_json = test
127+
ii_filter = zcl_ajson_extensions=>filter_empty_zero_null( ) ).
128+
129+
cl_abap_unit_assert=>assert_equals(
130+
act = act->stringify( )
131+
exp = '{"a":"1"}' ).
132+
133+
ENDMETHOD.
134+
135+
ENDCLASS.

src/zcl_ajson_extensions.clas.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
3+
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
4+
<asx:values>
5+
<VSEOCLASS>
6+
<CLSNAME>ZCL_AJSON_EXTENSIONS</CLSNAME>
7+
<LANGU>E</LANGU>
8+
<DESCRIPT>AJSON More Libraries</DESCRIPT>
9+
<STATE>1</STATE>
10+
<CLSCCINCL>X</CLSCCINCL>
11+
<FIXPT>X</FIXPT>
12+
<UNICODE>X</UNICODE>
13+
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
14+
</VSEOCLASS>
15+
</asx:values>
16+
</asx:abap>
17+
</abapGit>

0 commit comments

Comments
 (0)