Skip to content

Commit 83dbe9a

Browse files
[create-pull-request] automated change (#115)
Co-authored-by: larshp <[email protected]>
1 parent fce2fe2 commit 83dbe9a

3 files changed

+238
-19
lines changed

src/zcl_abapgit_ajson.clas.abap

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ CLASS zcl_abapgit_ajson DEFINITION
5050

5151
CLASS-METHODS parse
5252
IMPORTING
53-
!iv_json TYPE string
53+
!iv_json TYPE any
5454
!iv_freeze TYPE abap_bool DEFAULT abap_false
5555
!ii_custom_mapping TYPE REF TO zif_abapgit_ajson_mapping OPTIONAL
5656
!iv_keep_item_order TYPE abap_bool DEFAULT abap_false

src/zcl_abapgit_ajson.clas.locals_imp.abap

+139-18
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,27 @@ INTERFACE lif_kind.
2020

2121
CONSTANTS:
2222
BEGIN OF numeric,
23-
int1 TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_int1,
24-
int2 TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_int2,
25-
int4 TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_int,
26-
int8 TYPE ty_kind VALUE '8', " cl_abap_tabledescr=>typekind_int8 not in lower releases
27-
float TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_float,
28-
packed TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_packed,
29-
decfloat16 TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_decfloat16,
30-
decfloat34 TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_decfloat34,
23+
int1 TYPE ty_kind VALUE cl_abap_typedescr=>typekind_int1,
24+
int2 TYPE ty_kind VALUE cl_abap_typedescr=>typekind_int2,
25+
int4 TYPE ty_kind VALUE cl_abap_typedescr=>typekind_int,
26+
int8 TYPE ty_kind VALUE '8', " cl_abap_typedescr=>typekind_int8 not in lower releases
27+
float TYPE ty_kind VALUE cl_abap_typedescr=>typekind_float,
28+
packed TYPE ty_kind VALUE cl_abap_typedescr=>typekind_packed,
29+
decfloat16 TYPE ty_kind VALUE cl_abap_typedescr=>typekind_decfloat16,
30+
decfloat34 TYPE ty_kind VALUE cl_abap_typedescr=>typekind_decfloat34,
3131
END OF numeric.
3232

3333
CONSTANTS:
3434
BEGIN OF texts,
35-
char TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_char,
36-
numc TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_num,
37-
string TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_string,
35+
char TYPE ty_kind VALUE cl_abap_typedescr=>typekind_char,
36+
numc TYPE ty_kind VALUE cl_abap_typedescr=>typekind_num,
37+
string TYPE ty_kind VALUE cl_abap_typedescr=>typekind_string,
3838
END OF texts.
3939

4040
CONSTANTS:
4141
BEGIN OF binary,
42-
hex TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_hex,
43-
xstring TYPE ty_kind VALUE cl_abap_tabledescr=>typekind_xstring,
42+
hex TYPE ty_kind VALUE cl_abap_typedescr=>typekind_hex,
43+
xstring TYPE ty_kind VALUE cl_abap_typedescr=>typekind_xstring,
4444
END OF binary.
4545

4646
CONSTANTS:
@@ -80,6 +80,25 @@ CLASS lcl_utils DEFINITION FINAL.
8080
iv_str TYPE string
8181
RETURNING
8282
VALUE(rv_xstr) TYPE xstring.
83+
CLASS-METHODS xstring_to_string_utf8
84+
IMPORTING
85+
iv_xstr TYPE xstring
86+
RETURNING
87+
VALUE(rv_str) TYPE string.
88+
CLASS-METHODS any_to_xstring
89+
IMPORTING
90+
iv_data TYPE any
91+
RETURNING
92+
VALUE(rv_xstr) TYPE xstring
93+
RAISING
94+
zcx_abapgit_ajson_error.
95+
CLASS-METHODS any_to_string
96+
IMPORTING
97+
iv_data TYPE any
98+
RETURNING
99+
VALUE(rv_str) TYPE string
100+
RAISING
101+
zcx_abapgit_ajson_error.
83102

84103
ENDCLASS.
85104

@@ -116,6 +135,37 @@ CLASS lcl_utils IMPLEMENTATION.
116135

117136
ENDMETHOD.
118137

138+
METHOD xstring_to_string_utf8.
139+
140+
DATA lo_conv TYPE REF TO object.
141+
DATA lv_in_ce TYPE string.
142+
143+
lv_in_ce = 'CL_ABAP_CONV_IN_CE'.
144+
145+
TRY.
146+
CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_in
147+
RECEIVING
148+
instance = lo_conv.
149+
CALL METHOD lo_conv->('IF_ABAP_CONV_IN~CONVERT')
150+
EXPORTING
151+
source = iv_xstr
152+
RECEIVING
153+
result = rv_str.
154+
CATCH cx_sy_dyn_call_illegal_class.
155+
CALL METHOD (lv_in_ce)=>create
156+
EXPORTING
157+
encoding = 'UTF-8'
158+
RECEIVING
159+
conv = lo_conv.
160+
CALL METHOD lo_conv->('CONVERT')
161+
EXPORTING
162+
data = iv_xstr
163+
IMPORTING
164+
buffer = rv_str.
165+
ENDTRY.
166+
167+
ENDMETHOD.
168+
119169
METHOD validate_array_index.
120170

121171
IF NOT iv_index CO '0123456789'.
@@ -176,6 +226,74 @@ CLASS lcl_utils IMPLEMENTATION.
176226

177227
ENDMETHOD.
178228

229+
METHOD any_to_xstring.
230+
" supports xstring, char, string, or string_table as input
231+
232+
DATA lo_type TYPE REF TO cl_abap_typedescr.
233+
DATA lo_table_type TYPE REF TO cl_abap_tabledescr.
234+
DATA lv_str TYPE string.
235+
236+
FIELD-SYMBOLS: <data> TYPE STANDARD TABLE.
237+
238+
lo_type = cl_abap_typedescr=>describe_by_data( iv_data ).
239+
240+
CASE lo_type->type_kind.
241+
WHEN lif_kind=>binary-xstring.
242+
rv_xstr = iv_data.
243+
WHEN lif_kind=>texts-string OR lif_kind=>texts-char.
244+
rv_xstr = string_to_xstring_utf8( iv_data ).
245+
WHEN lif_kind=>table.
246+
lo_table_type ?= lo_type.
247+
IF lo_table_type->table_kind <> cl_abap_tabledescr=>tablekind_std.
248+
zcx_abapgit_ajson_error=>raise( 'Unsupported type of input table (must be standard table)' ).
249+
ENDIF.
250+
TRY.
251+
ASSIGN iv_data TO <data>.
252+
lv_str = concat_lines_of( table = <data>
253+
sep = cl_abap_char_utilities=>newline ).
254+
rv_xstr = string_to_xstring_utf8( lv_str ).
255+
CATCH cx_root.
256+
zcx_abapgit_ajson_error=>raise( 'Error converting input table (should be string_table)' ).
257+
ENDTRY.
258+
WHEN OTHERS.
259+
zcx_abapgit_ajson_error=>raise( 'Unsupported type of input (must be char, string, string_table, or xstring)' ).
260+
ENDCASE.
261+
262+
ENDMETHOD.
263+
264+
METHOD any_to_string.
265+
" supports xstring, char, string, or string_table as input
266+
267+
DATA lo_type TYPE REF TO cl_abap_typedescr.
268+
DATA lo_table_type TYPE REF TO cl_abap_tabledescr.
269+
270+
FIELD-SYMBOLS: <data> TYPE STANDARD TABLE.
271+
272+
lo_type = cl_abap_typedescr=>describe_by_data( iv_data ).
273+
274+
CASE lo_type->type_kind.
275+
WHEN lif_kind=>binary-xstring.
276+
rv_str = xstring_to_string_utf8( iv_data ).
277+
WHEN lif_kind=>texts-string OR lif_kind=>texts-char.
278+
rv_str = iv_data.
279+
WHEN lif_kind=>table.
280+
lo_table_type ?= lo_type.
281+
IF lo_table_type->table_kind <> cl_abap_tabledescr=>tablekind_std.
282+
zcx_abapgit_ajson_error=>raise( 'Unsupported type of input table (must be standard table)' ).
283+
ENDIF.
284+
TRY.
285+
ASSIGN iv_data TO <data>.
286+
rv_str = concat_lines_of( table = <data>
287+
sep = cl_abap_char_utilities=>newline ).
288+
CATCH cx_root.
289+
zcx_abapgit_ajson_error=>raise( 'Error converting input table (should be string_table)' ).
290+
ENDTRY.
291+
WHEN OTHERS.
292+
zcx_abapgit_ajson_error=>raise( 'Unsupported type of input (must be char, string, string_table, or xstring)' ).
293+
ENDCASE.
294+
295+
ENDMETHOD.
296+
179297
ENDCLASS.
180298

181299

@@ -188,7 +306,7 @@ CLASS lcl_json_parser DEFINITION FINAL.
188306

189307
METHODS parse
190308
IMPORTING
191-
iv_json TYPE string
309+
iv_json TYPE any
192310
iv_keep_item_order TYPE abap_bool DEFAULT abap_false
193311
RETURNING
194312
VALUE(rt_json_tree) TYPE zif_abapgit_ajson_types=>ty_nodes_tt
@@ -212,7 +330,7 @@ CLASS lcl_json_parser DEFINITION FINAL.
212330

213331
METHODS _parse
214332
IMPORTING
215-
iv_json TYPE string
333+
iv_json TYPE xstring
216334
RETURNING
217335
VALUE(rt_json_tree) TYPE zif_abapgit_ajson_types=>ty_nodes_tt
218336
RAISING
@@ -233,17 +351,20 @@ CLASS lcl_json_parser IMPLEMENTATION.
233351
DATA lx_sxml_parse TYPE REF TO cx_sxml_parse_error.
234352
DATA lx_sxml TYPE REF TO cx_dynamic_check.
235353
DATA lv_location TYPE string.
354+
DATA lv_json TYPE xstring.
236355

237356
mv_keep_item_order = iv_keep_item_order.
238357

358+
lv_json = lcl_utils=>any_to_xstring( iv_json ).
359+
239360
TRY.
240361
" TODO sane JSON check:
241362
" JSON can be true,false,null,(-)digits
242363
" or start from " or from {
243-
rt_json_tree = _parse( iv_json ).
364+
rt_json_tree = _parse( lv_json ).
244365
CATCH cx_sxml_parse_error INTO lx_sxml_parse.
245366
lv_location = _get_location(
246-
iv_json = iv_json
367+
iv_json = lcl_utils=>any_to_string( iv_json )
247368
iv_offset = lx_sxml_parse->xml_offset ).
248369
zcx_abapgit_ajson_error=>raise(
249370
iv_msg = |Json parsing error (SXML): { lx_sxml_parse->get_text( ) }|
@@ -305,7 +426,7 @@ CLASS lcl_json_parser IMPLEMENTATION.
305426
IF iv_json IS INITIAL.
306427
RETURN.
307428
ENDIF.
308-
lo_reader = cl_sxml_string_reader=>create( lcl_utils=>string_to_xstring_utf8( iv_json ) ).
429+
lo_reader = cl_sxml_string_reader=>create( iv_json ).
309430

310431
" TODO: self protection, check non-empty, check starting from object ...
311432

src/zcl_abapgit_ajson.clas.testclasses.abap

+98
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ CLASS ltcl_parser_test DEFINITION FINAL
8585
METHODS parse_date FOR TESTING RAISING zcx_abapgit_ajson_error.
8686
METHODS parse_bare_values FOR TESTING RAISING zcx_abapgit_ajson_error.
8787
METHODS parse_error FOR TESTING RAISING zcx_abapgit_ajson_error.
88+
METHODS parse_input_xstring FOR TESTING RAISING zcx_abapgit_ajson_error.
89+
METHODS parse_input_string FOR TESTING RAISING zcx_abapgit_ajson_error.
90+
METHODS parse_input_string_table FOR TESTING RAISING zcx_abapgit_ajson_error.
91+
METHODS parse_input_error FOR TESTING RAISING zcx_abapgit_ajson_error.
8892
METHODS duplicate_key FOR TESTING RAISING zcx_abapgit_ajson_error.
8993
METHODS non_json FOR TESTING RAISING zcx_abapgit_ajson_error.
9094

@@ -248,6 +252,78 @@ CLASS ltcl_parser_test IMPLEMENTATION.
248252
exp = mo_nodes->mt_nodes ).
249253
ENDMETHOD.
250254

255+
METHOD parse_input_xstring.
256+
mo_nodes->add( ' | |object | | |1' ).
257+
mo_nodes->add( '/ |string |str |abc | |0' ).
258+
259+
DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
260+
DATA lv_xstr TYPE xstring.
261+
262+
lv_xstr = '7B22737472696E67223A2022616263227D0A'.
263+
lt_act = mo_cut->parse( lv_xstr ).
264+
cl_abap_unit_assert=>assert_equals(
265+
act = lt_act
266+
exp = mo_nodes->mt_nodes ).
267+
ENDMETHOD.
268+
269+
METHOD parse_input_string.
270+
mo_nodes->add( ' | |object | | |1' ).
271+
mo_nodes->add( '/ |string |str |abc | |0' ).
272+
273+
DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
274+
DATA lv_str TYPE string.
275+
276+
lv_str = `{"string": "abc"}`.
277+
lt_act = mo_cut->parse( lv_str ).
278+
cl_abap_unit_assert=>assert_equals(
279+
act = lt_act
280+
exp = mo_nodes->mt_nodes ).
281+
ENDMETHOD.
282+
283+
METHOD parse_input_string_table.
284+
mo_nodes->add( ' | |object | | |2' ).
285+
mo_nodes->add( '/ |string |str |abc | |0' ).
286+
mo_nodes->add( '/ |number |num |123 | |0' ).
287+
288+
DATA lt_act TYPE zif_abapgit_ajson_types=>ty_nodes_tt.
289+
DATA lt_json TYPE string_table.
290+
291+
INSERT `{` INTO TABLE lt_json.
292+
INSERT `"string": "abc",` INTO TABLE lt_json.
293+
INSERT `"number": 123` INTO TABLE lt_json.
294+
INSERT `}` INTO TABLE lt_json.
295+
296+
lt_act = mo_cut->parse( lt_json ).
297+
cl_abap_unit_assert=>assert_equals(
298+
act = lt_act
299+
exp = mo_nodes->mt_nodes ).
300+
ENDMETHOD.
301+
302+
METHOD parse_input_error.
303+
304+
DATA lo_cut TYPE REF TO lcl_json_parser.
305+
DATA lx TYPE REF TO zcx_abapgit_ajson_error.
306+
DATA lv_numc TYPE n LENGTH 10.
307+
DATA lt_hashed TYPE HASHED TABLE OF string WITH UNIQUE DEFAULT KEY.
308+
309+
CREATE OBJECT lo_cut.
310+
311+
TRY.
312+
lo_cut->parse( lv_numc ).
313+
cl_abap_unit_assert=>fail( ).
314+
CATCH zcx_abapgit_ajson_error INTO lx.
315+
cl_abap_unit_assert=>assert_not_initial( lx ).
316+
ENDTRY.
317+
318+
TRY.
319+
lo_cut->parse( lt_hashed ).
320+
cl_abap_unit_assert=>fail( ).
321+
CATCH zcx_abapgit_ajson_error INTO lx.
322+
cl_abap_unit_assert=>assert_not_initial( lx ).
323+
ENDTRY.
324+
325+
ENDMETHOD.
326+
251327
METHOD sample_json.
252328

253329
rv_json =
@@ -2401,6 +2477,7 @@ CLASS ltcl_writer_test DEFINITION FINAL
24012477
METHODS set_bool_tab FOR TESTING RAISING zcx_abapgit_ajson_error.
24022478
METHODS set_str FOR TESTING RAISING zcx_abapgit_ajson_error.
24032479
METHODS set_int FOR TESTING RAISING zcx_abapgit_ajson_error.
2480+
METHODS set_number FOR TESTING RAISING zcx_abapgit_ajson_error.
24042481
METHODS set_date FOR TESTING RAISING zcx_abapgit_ajson_error.
24052482
METHODS set_timestamp FOR TESTING RAISING zcx_abapgit_ajson_error.
24062483
METHODS read_only FOR TESTING RAISING zcx_abapgit_ajson_error.
@@ -3241,6 +3318,27 @@ CLASS ltcl_writer_test IMPLEMENTATION.
32413318

32423319
ENDMETHOD.
32433320

3321+
METHOD set_number.
3322+
3323+
DATA lo_nodes_exp TYPE REF TO lcl_nodes_helper.
3324+
DATA li_json TYPE REF TO zif_abapgit_ajson.
3325+
DATA lv_p TYPE p LENGTH 5 DECIMALS 2 VALUE '123.45'.
3326+
3327+
li_json = zcl_abapgit_ajson=>create_empty( ).
3328+
CREATE OBJECT lo_nodes_exp.
3329+
lo_nodes_exp->add( ' | |object | ||1' ).
3330+
lo_nodes_exp->add( '/ |a |num |123.45 ||0' ).
3331+
3332+
li_json->set(
3333+
iv_path = '/a'
3334+
iv_val = lv_p ).
3335+
3336+
cl_abap_unit_assert=>assert_equals(
3337+
act = li_json->mt_json_tree
3338+
exp = lo_nodes_exp->sorted( ) ).
3339+
3340+
ENDMETHOD.
3341+
32443342
METHOD set_date.
32453343

32463344
DATA lo_cut TYPE REF TO zcl_abapgit_ajson.

0 commit comments

Comments
 (0)