sapbuddy-dsh 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +25 -4
- package/defaults/AGENTS.md +114 -114
- package/defaults/connections.example.json +21 -21
- package/defaults/prompts/Memory.md +21 -21
- package/defaults/prompts/SYSTEM.md +110 -110
- package/defaults/settings.example.json +3 -3
- package/dist/client.js +20 -5
- package/dist/index.js +85 -11
- package/dist/sap-tools/adtManager.d.ts +11 -1
- package/dist/sap-tools/adtManager.js +176 -9
- package/dist/sap-tools/connections-store.js +16 -3
- package/dist/sap-tools/execution.js +1 -1
- package/dist/tools.js +5 -3
- package/package.json +8 -3
- package/skills/abap-code-review/SKILL.md +75 -75
- package/skills/abap-code-review/assets/report-template.html +142 -142
- package/skills/abap-code-review/references/checklist.md +114 -114
- package/skills/abap-explain/SKILL.md +126 -126
- package/skills/abap-templates/SKILL.md +764 -764
- package/skills/abap-wiki/SKILL.md +104 -104
- package/skills/clean-abap/SKILL.md +91 -91
- package/skills/clean-abap/references/CleanABAP_zh.md +4309 -4309
- package/skills/dev-write/SKILL.md +137 -137
- package/skills/sap-abap-skills/README.md +205 -205
- package/skills/sap-abap-skills/SKILL.md +498 -498
- package/skills/sap-abap-skills/references/abap-dictionary.md +211 -211
- package/skills/sap-abap-skills/references/abap-sql.md +588 -588
- package/skills/sap-abap-skills/references/amdp.md +279 -279
- package/skills/sap-abap-skills/references/authorization.md +149 -149
- package/skills/sap-abap-skills/references/bits-bytes.md +92 -92
- package/skills/sap-abap-skills/references/builtin-functions.md +373 -373
- package/skills/sap-abap-skills/references/cds-views.md +412 -412
- package/skills/sap-abap-skills/references/cloud-development.md +299 -299
- package/skills/sap-abap-skills/references/constructor-expressions.md +458 -458
- package/skills/sap-abap-skills/references/date-time.md +415 -415
- package/skills/sap-abap-skills/references/design-patterns.md +292 -292
- package/skills/sap-abap-skills/references/dynamic-programming.md +426 -426
- package/skills/sap-abap-skills/references/exceptions.md +432 -432
- package/skills/sap-abap-skills/references/generative-ai.md +180 -180
- package/skills/sap-abap-skills/references/internal-tables.md +578 -578
- package/skills/sap-abap-skills/references/numeric-operations.md +219 -219
- package/skills/sap-abap-skills/references/object-orientation.md +518 -518
- package/skills/sap-abap-skills/references/performance.md +428 -428
- package/skills/sap-abap-skills/references/program-flow.md +302 -302
- package/skills/sap-abap-skills/references/rap-eml.md +549 -549
- package/skills/sap-abap-skills/references/released-classes.md +308 -308
- package/skills/sap-abap-skills/references/sap-luw.md +203 -203
- package/skills/sap-abap-skills/references/skill-reference-guide.md +98 -98
- package/skills/sap-abap-skills/references/sql-hierarchies.md +180 -180
- package/skills/sap-abap-skills/references/string-processing.md +488 -488
- package/skills/sap-abap-skills/references/table-grouping.md +150 -150
- package/skills/sap-abap-skills/references/tool-guide.md +285 -285
- package/skills/sap-abap-skills/references/unit-testing.md +512 -512
- package/skills/sap-abap-skills/references/where-conditions.md +223 -223
- package/skills/sap-abap-skills/references/xml-json.md +315 -315
- package/skills/translate-workflow/SKILL.md +69 -69
|
@@ -1,315 +1,315 @@
|
|
|
1
|
-
# XML and JSON Processing - Complete Reference
|
|
2
|
-
|
|
3
|
-
**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/21_XML_JSON.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/21_XML_JSON.md)
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## XML Processing Libraries
|
|
8
|
-
|
|
9
|
-
### iXML (DOM-Based)
|
|
10
|
-
|
|
11
|
-
Higher memory, full DOM tree in memory.
|
|
12
|
-
|
|
13
|
-
**Creating XML:**
|
|
14
|
-
|
|
15
|
-
```abap
|
|
16
|
-
DATA(ixml) = cl_ixml_core=>create( ).
|
|
17
|
-
DATA(document) = ixml->create_document( ).
|
|
18
|
-
|
|
19
|
-
" Create root element
|
|
20
|
-
DATA(root) = document->create_element_ns( name = 'root' prefix = 'ns' ).
|
|
21
|
-
document->append_child( root ).
|
|
22
|
-
|
|
23
|
-
" Create child elements
|
|
24
|
-
DATA(child) = document->create_element( 'item' ).
|
|
25
|
-
child->set_value( 'value' ).
|
|
26
|
-
root->append_child( child ).
|
|
27
|
-
|
|
28
|
-
" Render to xstring
|
|
29
|
-
DATA xml TYPE xstring.
|
|
30
|
-
ixml->create_renderer(
|
|
31
|
-
document = document
|
|
32
|
-
ostream = ixml->create_stream_factory( )->create_ostream_xstring( string = xml )
|
|
33
|
-
)->render( ).
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**Parsing XML:**
|
|
37
|
-
|
|
38
|
-
```abap
|
|
39
|
-
DATA(ixml) = cl_ixml_core=>create( ).
|
|
40
|
-
DATA(document) = ixml->create_document( ).
|
|
41
|
-
DATA(parser) = ixml->create_parser(
|
|
42
|
-
istream = ixml->create_stream_factory( )->create_istream_xstring( string = xml )
|
|
43
|
-
document = document
|
|
44
|
-
stream_factory = ixml->create_stream_factory( ) ).
|
|
45
|
-
|
|
46
|
-
IF parser->parse( ) = 0.
|
|
47
|
-
DATA(root) = document->get_root_element( ).
|
|
48
|
-
DATA(child) = root->get_first_child( ).
|
|
49
|
-
ENDIF.
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### sXML (Token-Based)
|
|
53
|
-
|
|
54
|
-
More memory-efficient, sequential processing.
|
|
55
|
-
|
|
56
|
-
**Creating XML:**
|
|
57
|
-
|
|
58
|
-
```abap
|
|
59
|
-
DATA(writer) = CAST if_sxml_writer(
|
|
60
|
-
cl_sxml_string_writer=>create( type = if_sxml=>co_xt_xml10 ) ).
|
|
61
|
-
|
|
62
|
-
TRY.
|
|
63
|
-
writer->open_element( name = 'root' ).
|
|
64
|
-
writer->open_element( name = 'item' ).
|
|
65
|
-
writer->write_value( 'value' ).
|
|
66
|
-
writer->close_element( ).
|
|
67
|
-
writer->close_element( ).
|
|
68
|
-
CATCH cx_sxml_state_error.
|
|
69
|
-
ENDTRY.
|
|
70
|
-
|
|
71
|
-
DATA(xml) = CAST cl_sxml_string_writer( writer )->get_output( ).
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
**Parsing XML:**
|
|
75
|
-
|
|
76
|
-
```abap
|
|
77
|
-
DATA(reader) = cl_sxml_string_reader=>create( xml ).
|
|
78
|
-
|
|
79
|
-
TRY.
|
|
80
|
-
DO.
|
|
81
|
-
reader->next_node( ).
|
|
82
|
-
IF reader->node_type = if_sxml_node=>co_nt_final.
|
|
83
|
-
EXIT.
|
|
84
|
-
ENDIF.
|
|
85
|
-
|
|
86
|
-
CASE reader->node_type.
|
|
87
|
-
WHEN if_sxml_node=>co_nt_element_open.
|
|
88
|
-
DATA(name) = reader->name.
|
|
89
|
-
WHEN if_sxml_node=>co_nt_value.
|
|
90
|
-
DATA(value) = reader->value.
|
|
91
|
-
ENDCASE.
|
|
92
|
-
ENDDO.
|
|
93
|
-
CATCH cx_sxml_state_error.
|
|
94
|
-
ENDTRY.
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## CALL TRANSFORMATION
|
|
100
|
-
|
|
101
|
-
### ABAP to XML
|
|
102
|
-
|
|
103
|
-
```abap
|
|
104
|
-
" Single data object
|
|
105
|
-
CALL TRANSFORMATION id
|
|
106
|
-
SOURCE data = my_data
|
|
107
|
-
RESULT XML DATA(xml).
|
|
108
|
-
|
|
109
|
-
" Multiple sources
|
|
110
|
-
CALL TRANSFORMATION id
|
|
111
|
-
SOURCE obj1 = data1 obj2 = data2
|
|
112
|
-
RESULT XML xml.
|
|
113
|
-
|
|
114
|
-
" Dynamic specification
|
|
115
|
-
DATA(srctab) = VALUE abap_trans_srcbind_tab(
|
|
116
|
-
( name = 'DATA' value = REF #( my_data ) ) ).
|
|
117
|
-
CALL TRANSFORMATION id
|
|
118
|
-
SOURCE (srctab)
|
|
119
|
-
RESULT XML xml.
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### XML to ABAP
|
|
123
|
-
|
|
124
|
-
```abap
|
|
125
|
-
" Single target
|
|
126
|
-
CALL TRANSFORMATION id
|
|
127
|
-
SOURCE XML xml
|
|
128
|
-
RESULT data = my_data.
|
|
129
|
-
|
|
130
|
-
" Dynamic specification
|
|
131
|
-
DATA(restab) = VALUE abap_trans_resbind_tab(
|
|
132
|
-
( name = 'DATA' value = REF #( my_data ) ) ).
|
|
133
|
-
CALL TRANSFORMATION id
|
|
134
|
-
SOURCE XML xml
|
|
135
|
-
RESULT (restab).
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## JSON Processing
|
|
141
|
-
|
|
142
|
-
### Creating JSON with sXML
|
|
143
|
-
|
|
144
|
-
```abap
|
|
145
|
-
DATA(writer) = CAST if_sxml_writer(
|
|
146
|
-
cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ).
|
|
147
|
-
|
|
148
|
-
TRY.
|
|
149
|
-
writer->open_element( name = 'object' ).
|
|
150
|
-
writer->open_element( name = 'str' ).
|
|
151
|
-
writer->write_attribute( name = 'name' value = 'key' ).
|
|
152
|
-
writer->write_value( 'value' ).
|
|
153
|
-
writer->close_element( ).
|
|
154
|
-
writer->close_element( ).
|
|
155
|
-
CATCH cx_sxml_state_error.
|
|
156
|
-
ENDTRY.
|
|
157
|
-
|
|
158
|
-
DATA(json) = cl_abap_conv_codepage=>create_in( )->convert(
|
|
159
|
-
CAST cl_sxml_string_writer( writer )->get_output( ) ).
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### CALL TRANSFORMATION for JSON
|
|
163
|
-
|
|
164
|
-
```abap
|
|
165
|
-
" ABAP to JSON
|
|
166
|
-
DATA(json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
|
|
167
|
-
CALL TRANSFORMATION id
|
|
168
|
-
SOURCE data = my_data
|
|
169
|
-
RESULT XML json_writer.
|
|
170
|
-
DATA(json) = json_writer->get_output( ).
|
|
171
|
-
|
|
172
|
-
" Using SOURCE/RESULT JSON
|
|
173
|
-
CALL TRANSFORMATION id
|
|
174
|
-
SOURCE data = my_data
|
|
175
|
-
RESULT JSON DATA(json_xstr).
|
|
176
|
-
|
|
177
|
-
" JSON to ABAP
|
|
178
|
-
CALL TRANSFORMATION id
|
|
179
|
-
SOURCE JSON json_xstr
|
|
180
|
-
RESULT data = my_data.
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Formatted JSON Output
|
|
184
|
-
|
|
185
|
-
```abap
|
|
186
|
-
DATA(writer) = CAST if_sxml_writer(
|
|
187
|
-
cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ).
|
|
188
|
-
writer->set_option( option = if_sxml_writer=>co_opt_linebreaks ).
|
|
189
|
-
writer->set_option( option = if_sxml_writer=>co_opt_indent ).
|
|
190
|
-
|
|
191
|
-
CALL TRANSFORMATION id
|
|
192
|
-
SOURCE data = my_data
|
|
193
|
-
RESULT XML writer.
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## XCO Library for JSON
|
|
199
|
-
|
|
200
|
-
```abap
|
|
201
|
-
" ABAP to JSON
|
|
202
|
-
DATA(json) = xco_cp_json=>data->from_abap( my_data )->to_string( ).
|
|
203
|
-
|
|
204
|
-
" JSON to ABAP
|
|
205
|
-
xco_cp_json=>data->from_string( json )->write_to( REF #( my_data ) ).
|
|
206
|
-
|
|
207
|
-
" Build JSON manually
|
|
208
|
-
DATA(builder) = xco_cp_json=>data->builder( ).
|
|
209
|
-
builder->begin_object( )
|
|
210
|
-
->add_member( 'key' )->add_string( 'value' )
|
|
211
|
-
->add_member( 'number' )->add_number( 123 )
|
|
212
|
-
->end_object( ).
|
|
213
|
-
DATA(json_built) = builder->get_data( )->to_string( ).
|
|
214
|
-
|
|
215
|
-
" Name transformation
|
|
216
|
-
xco_cp_json=>data->from_string( json )->apply( VALUE #(
|
|
217
|
-
( xco_cp_json=>transformation->pascal_case_to_underscore )
|
|
218
|
-
) )->write_to( REF #( my_data ) ).
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
---
|
|
222
|
-
|
|
223
|
-
## /ui2/cl_json Class
|
|
224
|
-
|
|
225
|
-
```abap
|
|
226
|
-
" Serialize (ABAP to JSON)
|
|
227
|
-
DATA(json) = /ui2/cl_json=>serialize( data = my_data ).
|
|
228
|
-
|
|
229
|
-
" With formatting
|
|
230
|
-
DATA(json_pretty) = /ui2/cl_json=>serialize(
|
|
231
|
-
data = my_data
|
|
232
|
-
format_output = abap_true
|
|
233
|
-
pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
|
|
234
|
-
|
|
235
|
-
" Deserialize (JSON to ABAP)
|
|
236
|
-
/ui2/cl_json=>deserialize(
|
|
237
|
-
EXPORTING json = json
|
|
238
|
-
CHANGING data = my_data ).
|
|
239
|
-
|
|
240
|
-
" With name mapping
|
|
241
|
-
/ui2/cl_json=>deserialize(
|
|
242
|
-
EXPORTING json = json
|
|
243
|
-
name_mappings = VALUE #(
|
|
244
|
-
( abap = 'FIELD1' json = 'field_one' )
|
|
245
|
-
( abap = 'FIELD2' json = 'fieldTwo' ) )
|
|
246
|
-
CHANGING data = my_data ).
|
|
247
|
-
|
|
248
|
-
" Generate ABAP type from JSON
|
|
249
|
-
DATA(dref) = /ui2/cl_json=>generate( json = json ).
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## String/XString Conversion
|
|
255
|
-
|
|
256
|
-
```abap
|
|
257
|
-
" String to xstring
|
|
258
|
-
DATA(xstr) = cl_abap_conv_codepage=>create_out( codepage = 'UTF-8' )->convert( str ).
|
|
259
|
-
|
|
260
|
-
" XString to string
|
|
261
|
-
DATA(str) = cl_abap_conv_codepage=>create_in( )->convert( xstr ).
|
|
262
|
-
|
|
263
|
-
" Using XCO
|
|
264
|
-
DATA(xstr_xco) = xco_cp=>string( str )->as_xstring( xco_cp_character=>code_page->utf_8 )->value.
|
|
265
|
-
DATA(str_xco) = xco_cp=>xstring( xstr )->as_string( xco_cp_character=>code_page->utf_8 )->value.
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
|
-
## Compression
|
|
271
|
-
|
|
272
|
-
```abap
|
|
273
|
-
" Compress
|
|
274
|
-
cl_abap_gzip=>compress_binary(
|
|
275
|
-
EXPORTING raw_in = xstr
|
|
276
|
-
IMPORTING gzip_out = compressed ).
|
|
277
|
-
|
|
278
|
-
" Decompress
|
|
279
|
-
cl_abap_gzip=>decompress_binary(
|
|
280
|
-
EXPORTING gzip_in = compressed
|
|
281
|
-
IMPORTING raw_out = decompressed ).
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
## Object Serialization
|
|
287
|
-
|
|
288
|
-
Class must implement `IF_SERIALIZABLE_OBJECT`:
|
|
289
|
-
|
|
290
|
-
```abap
|
|
291
|
-
CLASS zcl_demo DEFINITION.
|
|
292
|
-
PUBLIC SECTION.
|
|
293
|
-
INTERFACES if_serializable_object.
|
|
294
|
-
DATA value TYPE string.
|
|
295
|
-
ENDCLASS.
|
|
296
|
-
|
|
297
|
-
" Serialize
|
|
298
|
-
DATA(obj) = NEW zcl_demo( ).
|
|
299
|
-
obj->value = 'test'.
|
|
300
|
-
CALL TRANSFORMATION id SOURCE obj = obj RESULT XML DATA(xml).
|
|
301
|
-
|
|
302
|
-
" Deserialize
|
|
303
|
-
DATA obj2 TYPE REF TO zcl_demo.
|
|
304
|
-
CALL TRANSFORMATION id SOURCE XML xml RESULT obj = obj2.
|
|
305
|
-
```
|
|
306
|
-
|
|
307
|
-
---
|
|
308
|
-
|
|
309
|
-
## Best Practices
|
|
310
|
-
|
|
311
|
-
1. **Use sXML** for memory efficiency with large documents
|
|
312
|
-
2. **Use XCO/ui2/cl_json** for simple JSON operations
|
|
313
|
-
3. **Use CALL TRANSFORMATION** for complex conversions
|
|
314
|
-
4. **Handle encoding** explicitly (UTF-8 recommended)
|
|
315
|
-
5. **Implement IF_SERIALIZABLE_OBJECT** for object serialization
|
|
1
|
+
# XML and JSON Processing - Complete Reference
|
|
2
|
+
|
|
3
|
+
**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/21_XML_JSON.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/21_XML_JSON.md)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## XML Processing Libraries
|
|
8
|
+
|
|
9
|
+
### iXML (DOM-Based)
|
|
10
|
+
|
|
11
|
+
Higher memory, full DOM tree in memory.
|
|
12
|
+
|
|
13
|
+
**Creating XML:**
|
|
14
|
+
|
|
15
|
+
```abap
|
|
16
|
+
DATA(ixml) = cl_ixml_core=>create( ).
|
|
17
|
+
DATA(document) = ixml->create_document( ).
|
|
18
|
+
|
|
19
|
+
" Create root element
|
|
20
|
+
DATA(root) = document->create_element_ns( name = 'root' prefix = 'ns' ).
|
|
21
|
+
document->append_child( root ).
|
|
22
|
+
|
|
23
|
+
" Create child elements
|
|
24
|
+
DATA(child) = document->create_element( 'item' ).
|
|
25
|
+
child->set_value( 'value' ).
|
|
26
|
+
root->append_child( child ).
|
|
27
|
+
|
|
28
|
+
" Render to xstring
|
|
29
|
+
DATA xml TYPE xstring.
|
|
30
|
+
ixml->create_renderer(
|
|
31
|
+
document = document
|
|
32
|
+
ostream = ixml->create_stream_factory( )->create_ostream_xstring( string = xml )
|
|
33
|
+
)->render( ).
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Parsing XML:**
|
|
37
|
+
|
|
38
|
+
```abap
|
|
39
|
+
DATA(ixml) = cl_ixml_core=>create( ).
|
|
40
|
+
DATA(document) = ixml->create_document( ).
|
|
41
|
+
DATA(parser) = ixml->create_parser(
|
|
42
|
+
istream = ixml->create_stream_factory( )->create_istream_xstring( string = xml )
|
|
43
|
+
document = document
|
|
44
|
+
stream_factory = ixml->create_stream_factory( ) ).
|
|
45
|
+
|
|
46
|
+
IF parser->parse( ) = 0.
|
|
47
|
+
DATA(root) = document->get_root_element( ).
|
|
48
|
+
DATA(child) = root->get_first_child( ).
|
|
49
|
+
ENDIF.
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### sXML (Token-Based)
|
|
53
|
+
|
|
54
|
+
More memory-efficient, sequential processing.
|
|
55
|
+
|
|
56
|
+
**Creating XML:**
|
|
57
|
+
|
|
58
|
+
```abap
|
|
59
|
+
DATA(writer) = CAST if_sxml_writer(
|
|
60
|
+
cl_sxml_string_writer=>create( type = if_sxml=>co_xt_xml10 ) ).
|
|
61
|
+
|
|
62
|
+
TRY.
|
|
63
|
+
writer->open_element( name = 'root' ).
|
|
64
|
+
writer->open_element( name = 'item' ).
|
|
65
|
+
writer->write_value( 'value' ).
|
|
66
|
+
writer->close_element( ).
|
|
67
|
+
writer->close_element( ).
|
|
68
|
+
CATCH cx_sxml_state_error.
|
|
69
|
+
ENDTRY.
|
|
70
|
+
|
|
71
|
+
DATA(xml) = CAST cl_sxml_string_writer( writer )->get_output( ).
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Parsing XML:**
|
|
75
|
+
|
|
76
|
+
```abap
|
|
77
|
+
DATA(reader) = cl_sxml_string_reader=>create( xml ).
|
|
78
|
+
|
|
79
|
+
TRY.
|
|
80
|
+
DO.
|
|
81
|
+
reader->next_node( ).
|
|
82
|
+
IF reader->node_type = if_sxml_node=>co_nt_final.
|
|
83
|
+
EXIT.
|
|
84
|
+
ENDIF.
|
|
85
|
+
|
|
86
|
+
CASE reader->node_type.
|
|
87
|
+
WHEN if_sxml_node=>co_nt_element_open.
|
|
88
|
+
DATA(name) = reader->name.
|
|
89
|
+
WHEN if_sxml_node=>co_nt_value.
|
|
90
|
+
DATA(value) = reader->value.
|
|
91
|
+
ENDCASE.
|
|
92
|
+
ENDDO.
|
|
93
|
+
CATCH cx_sxml_state_error.
|
|
94
|
+
ENDTRY.
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## CALL TRANSFORMATION
|
|
100
|
+
|
|
101
|
+
### ABAP to XML
|
|
102
|
+
|
|
103
|
+
```abap
|
|
104
|
+
" Single data object
|
|
105
|
+
CALL TRANSFORMATION id
|
|
106
|
+
SOURCE data = my_data
|
|
107
|
+
RESULT XML DATA(xml).
|
|
108
|
+
|
|
109
|
+
" Multiple sources
|
|
110
|
+
CALL TRANSFORMATION id
|
|
111
|
+
SOURCE obj1 = data1 obj2 = data2
|
|
112
|
+
RESULT XML xml.
|
|
113
|
+
|
|
114
|
+
" Dynamic specification
|
|
115
|
+
DATA(srctab) = VALUE abap_trans_srcbind_tab(
|
|
116
|
+
( name = 'DATA' value = REF #( my_data ) ) ).
|
|
117
|
+
CALL TRANSFORMATION id
|
|
118
|
+
SOURCE (srctab)
|
|
119
|
+
RESULT XML xml.
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### XML to ABAP
|
|
123
|
+
|
|
124
|
+
```abap
|
|
125
|
+
" Single target
|
|
126
|
+
CALL TRANSFORMATION id
|
|
127
|
+
SOURCE XML xml
|
|
128
|
+
RESULT data = my_data.
|
|
129
|
+
|
|
130
|
+
" Dynamic specification
|
|
131
|
+
DATA(restab) = VALUE abap_trans_resbind_tab(
|
|
132
|
+
( name = 'DATA' value = REF #( my_data ) ) ).
|
|
133
|
+
CALL TRANSFORMATION id
|
|
134
|
+
SOURCE XML xml
|
|
135
|
+
RESULT (restab).
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## JSON Processing
|
|
141
|
+
|
|
142
|
+
### Creating JSON with sXML
|
|
143
|
+
|
|
144
|
+
```abap
|
|
145
|
+
DATA(writer) = CAST if_sxml_writer(
|
|
146
|
+
cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ).
|
|
147
|
+
|
|
148
|
+
TRY.
|
|
149
|
+
writer->open_element( name = 'object' ).
|
|
150
|
+
writer->open_element( name = 'str' ).
|
|
151
|
+
writer->write_attribute( name = 'name' value = 'key' ).
|
|
152
|
+
writer->write_value( 'value' ).
|
|
153
|
+
writer->close_element( ).
|
|
154
|
+
writer->close_element( ).
|
|
155
|
+
CATCH cx_sxml_state_error.
|
|
156
|
+
ENDTRY.
|
|
157
|
+
|
|
158
|
+
DATA(json) = cl_abap_conv_codepage=>create_in( )->convert(
|
|
159
|
+
CAST cl_sxml_string_writer( writer )->get_output( ) ).
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### CALL TRANSFORMATION for JSON
|
|
163
|
+
|
|
164
|
+
```abap
|
|
165
|
+
" ABAP to JSON
|
|
166
|
+
DATA(json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
|
|
167
|
+
CALL TRANSFORMATION id
|
|
168
|
+
SOURCE data = my_data
|
|
169
|
+
RESULT XML json_writer.
|
|
170
|
+
DATA(json) = json_writer->get_output( ).
|
|
171
|
+
|
|
172
|
+
" Using SOURCE/RESULT JSON
|
|
173
|
+
CALL TRANSFORMATION id
|
|
174
|
+
SOURCE data = my_data
|
|
175
|
+
RESULT JSON DATA(json_xstr).
|
|
176
|
+
|
|
177
|
+
" JSON to ABAP
|
|
178
|
+
CALL TRANSFORMATION id
|
|
179
|
+
SOURCE JSON json_xstr
|
|
180
|
+
RESULT data = my_data.
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Formatted JSON Output
|
|
184
|
+
|
|
185
|
+
```abap
|
|
186
|
+
DATA(writer) = CAST if_sxml_writer(
|
|
187
|
+
cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ).
|
|
188
|
+
writer->set_option( option = if_sxml_writer=>co_opt_linebreaks ).
|
|
189
|
+
writer->set_option( option = if_sxml_writer=>co_opt_indent ).
|
|
190
|
+
|
|
191
|
+
CALL TRANSFORMATION id
|
|
192
|
+
SOURCE data = my_data
|
|
193
|
+
RESULT XML writer.
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## XCO Library for JSON
|
|
199
|
+
|
|
200
|
+
```abap
|
|
201
|
+
" ABAP to JSON
|
|
202
|
+
DATA(json) = xco_cp_json=>data->from_abap( my_data )->to_string( ).
|
|
203
|
+
|
|
204
|
+
" JSON to ABAP
|
|
205
|
+
xco_cp_json=>data->from_string( json )->write_to( REF #( my_data ) ).
|
|
206
|
+
|
|
207
|
+
" Build JSON manually
|
|
208
|
+
DATA(builder) = xco_cp_json=>data->builder( ).
|
|
209
|
+
builder->begin_object( )
|
|
210
|
+
->add_member( 'key' )->add_string( 'value' )
|
|
211
|
+
->add_member( 'number' )->add_number( 123 )
|
|
212
|
+
->end_object( ).
|
|
213
|
+
DATA(json_built) = builder->get_data( )->to_string( ).
|
|
214
|
+
|
|
215
|
+
" Name transformation
|
|
216
|
+
xco_cp_json=>data->from_string( json )->apply( VALUE #(
|
|
217
|
+
( xco_cp_json=>transformation->pascal_case_to_underscore )
|
|
218
|
+
) )->write_to( REF #( my_data ) ).
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## /ui2/cl_json Class
|
|
224
|
+
|
|
225
|
+
```abap
|
|
226
|
+
" Serialize (ABAP to JSON)
|
|
227
|
+
DATA(json) = /ui2/cl_json=>serialize( data = my_data ).
|
|
228
|
+
|
|
229
|
+
" With formatting
|
|
230
|
+
DATA(json_pretty) = /ui2/cl_json=>serialize(
|
|
231
|
+
data = my_data
|
|
232
|
+
format_output = abap_true
|
|
233
|
+
pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
|
|
234
|
+
|
|
235
|
+
" Deserialize (JSON to ABAP)
|
|
236
|
+
/ui2/cl_json=>deserialize(
|
|
237
|
+
EXPORTING json = json
|
|
238
|
+
CHANGING data = my_data ).
|
|
239
|
+
|
|
240
|
+
" With name mapping
|
|
241
|
+
/ui2/cl_json=>deserialize(
|
|
242
|
+
EXPORTING json = json
|
|
243
|
+
name_mappings = VALUE #(
|
|
244
|
+
( abap = 'FIELD1' json = 'field_one' )
|
|
245
|
+
( abap = 'FIELD2' json = 'fieldTwo' ) )
|
|
246
|
+
CHANGING data = my_data ).
|
|
247
|
+
|
|
248
|
+
" Generate ABAP type from JSON
|
|
249
|
+
DATA(dref) = /ui2/cl_json=>generate( json = json ).
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## String/XString Conversion
|
|
255
|
+
|
|
256
|
+
```abap
|
|
257
|
+
" String to xstring
|
|
258
|
+
DATA(xstr) = cl_abap_conv_codepage=>create_out( codepage = 'UTF-8' )->convert( str ).
|
|
259
|
+
|
|
260
|
+
" XString to string
|
|
261
|
+
DATA(str) = cl_abap_conv_codepage=>create_in( )->convert( xstr ).
|
|
262
|
+
|
|
263
|
+
" Using XCO
|
|
264
|
+
DATA(xstr_xco) = xco_cp=>string( str )->as_xstring( xco_cp_character=>code_page->utf_8 )->value.
|
|
265
|
+
DATA(str_xco) = xco_cp=>xstring( xstr )->as_string( xco_cp_character=>code_page->utf_8 )->value.
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Compression
|
|
271
|
+
|
|
272
|
+
```abap
|
|
273
|
+
" Compress
|
|
274
|
+
cl_abap_gzip=>compress_binary(
|
|
275
|
+
EXPORTING raw_in = xstr
|
|
276
|
+
IMPORTING gzip_out = compressed ).
|
|
277
|
+
|
|
278
|
+
" Decompress
|
|
279
|
+
cl_abap_gzip=>decompress_binary(
|
|
280
|
+
EXPORTING gzip_in = compressed
|
|
281
|
+
IMPORTING raw_out = decompressed ).
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Object Serialization
|
|
287
|
+
|
|
288
|
+
Class must implement `IF_SERIALIZABLE_OBJECT`:
|
|
289
|
+
|
|
290
|
+
```abap
|
|
291
|
+
CLASS zcl_demo DEFINITION.
|
|
292
|
+
PUBLIC SECTION.
|
|
293
|
+
INTERFACES if_serializable_object.
|
|
294
|
+
DATA value TYPE string.
|
|
295
|
+
ENDCLASS.
|
|
296
|
+
|
|
297
|
+
" Serialize
|
|
298
|
+
DATA(obj) = NEW zcl_demo( ).
|
|
299
|
+
obj->value = 'test'.
|
|
300
|
+
CALL TRANSFORMATION id SOURCE obj = obj RESULT XML DATA(xml).
|
|
301
|
+
|
|
302
|
+
" Deserialize
|
|
303
|
+
DATA obj2 TYPE REF TO zcl_demo.
|
|
304
|
+
CALL TRANSFORMATION id SOURCE XML xml RESULT obj = obj2.
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## Best Practices
|
|
310
|
+
|
|
311
|
+
1. **Use sXML** for memory efficiency with large documents
|
|
312
|
+
2. **Use XCO/ui2/cl_json** for simple JSON operations
|
|
313
|
+
3. **Use CALL TRANSFORMATION** for complex conversions
|
|
314
|
+
4. **Handle encoding** explicitly (UTF-8 recommended)
|
|
315
|
+
5. **Implement IF_SERIALIZABLE_OBJECT** for object serialization
|