@@ -20,27 +20,27 @@ INTERFACE lif_kind.
20
20
21
21
CONSTANTS :
22
22
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,
31
31
END OF numeric .
32
32
33
33
CONSTANTS :
34
34
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,
38
38
END OF texts.
39
39
40
40
CONSTANTS :
41
41
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,
44
44
END OF binary .
45
45
46
46
CONSTANTS :
@@ -80,6 +80,25 @@ CLASS lcl_utils DEFINITION FINAL.
80
80
iv_str TYPE string
81
81
RETURNING
82
82
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.
83
102
84
103
ENDCLASS .
85
104
@@ -116,6 +135,37 @@ CLASS lcl_utils IMPLEMENTATION.
116
135
117
136
ENDMETHOD .
118
137
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
+
119
169
METHOD validate_array_index .
120
170
121
171
IF NOT iv_index CO '0123456789' .
@@ -176,6 +226,74 @@ CLASS lcl_utils IMPLEMENTATION.
176
226
177
227
ENDMETHOD .
178
228
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
+
179
297
ENDCLASS .
180
298
181
299
@@ -188,7 +306,7 @@ CLASS lcl_json_parser DEFINITION FINAL.
188
306
189
307
METHODS parse
190
308
IMPORTING
191
- iv_json TYPE string
309
+ iv_json TYPE any
192
310
iv_keep_item_order TYPE abap_bool DEFAULT abap_false
193
311
RETURNING
194
312
VALUE (rt_json_tree ) TYPE zif_abapgit_ajson_types=>ty_nodes_tt
@@ -212,7 +330,7 @@ CLASS lcl_json_parser DEFINITION FINAL.
212
330
213
331
METHODS _parse
214
332
IMPORTING
215
- iv_json TYPE string
333
+ iv_json TYPE xstring
216
334
RETURNING
217
335
VALUE (rt_json_tree ) TYPE zif_abapgit_ajson_types=>ty_nodes_tt
218
336
RAISING
@@ -233,17 +351,20 @@ CLASS lcl_json_parser IMPLEMENTATION.
233
351
DATA lx_sxml_parse TYPE REF TO cx_sxml_parse_error.
234
352
DATA lx_sxml TYPE REF TO cx_dynamic_check.
235
353
DATA lv_location TYPE string .
354
+ DATA lv_json TYPE xstring .
236
355
237
356
mv_keep_item_order = iv_keep_item_order.
238
357
358
+ lv_json = lcl_utils=>any_to_xstring( iv_json ).
359
+
239
360
TRY .
240
361
" TODO sane JSON check:
241
362
" JSON can be true,false,null,(-)digits
242
363
" or start from " or from {
243
- rt_json_tree = _parse( iv_json ).
364
+ rt_json_tree = _parse( lv_json ).
244
365
CATCH cx_sxml_parse_error INTO lx_sxml_parse.
245
366
lv_location = _get_location(
246
- iv_json = iv_json
367
+ iv_json = lcl_utils=>any_to_string( iv_json )
247
368
iv_offset = lx_sxml_parse->xml_offset ).
248
369
zcx_abapgit_ajson_error=>raise(
249
370
iv_msg = | Json parsing error (SXML): { lx_sxml_parse->get_text( ) } |
@@ -305,7 +426,7 @@ CLASS lcl_json_parser IMPLEMENTATION.
305
426
IF iv_json IS INITIAL .
306
427
RETURN .
307
428
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 ).
309
430
310
431
" TODO: self protection, check non-empty, check starting from object ...
311
432
0 commit comments