ABAP中字符串的处理(包含特殊字符)

1. 字符串连接
CONCATENATE dobj1 dobj2 ... INTO result
[IN { BYTE | CHARACTER } MODE]
[SEPARATED BY sep].

2.字符串分隔, split 一个string的部分到一个内表或一系列的变量
SPLIT dobj AT sep INTO
{ {result1 result2 ...} | {TABLE result_tab} }
[IN {BYTE|CHARACTER} MODE].

3. 字符串查找, 在一个字符串中查找模式串(FIND or SEARCH)
FIND sub_string
IN SECTION [OFFSET off] [LENGTH len] OF dobj --> 灰色部分用来缩小目的串被查找的范围
[ IN { BYTE | CHARACTER } MODE ]
[ { RESPECTING | IGNORING } CASE ]
[ MATCH OFFSET moff ] [MATCH LENGTH mlen ].

FIND 'knows'
IN SECTION OFFSET 5 OF 'Everybody knows this is nowhere'
MATCH OFFSET moff " => moff = 10
MATCH LENGTH mlen. " => mlen= 5

在字符串dobj中查找pattern
SEARCH dobj FOR pattern [IN { BYTE | CHARACTER } MODE]
[STARTING AT p1] [ENDING AT p2]
[ABBREVIATED]
[AND MARK].
if sy-subrc = 0. then SY-FDPOS = 返回pattern在dobj中的位置
About pattern:
'pat' - 忽略尾部空格
'.pat.' -不忽略尾部空格
'*pat' - 以pat结尾
'pat*' - 以pat开始
单词是指: 用 空格 , ; : ? ! () / + =分隔的字串

4. 字符串替换
REPLACE SECTION [OFFSET off] [LENGTH len]
OF dobj WITH new
[IN { BYTE | CHARACTER } MODE].

REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF]
[SUBSTRING] sub_string
IN [SECTION [OFFSET off] [LENGTH len] OF ] dobj WITH new
[IN {BYTE|CHARACTER} MODE]
[{RESPECTING|IGNORING} CASE]
[REPLACEMENT COUNT rcnt]
[REPLACEMENT OFFSET roff]
[REPLACEMENT LENGTH rlen].
eg:
DATA: text1 TYPE string VALUE 'xababx'.
REPLACE 'ab' IN text1 WITH 'xx'. --> xxxabx

5. 去前导0 (Remove leading zero)
SHIFT dobj LEFT DELETING LEADING '0'.
FM : CONVERSION_EXIT_ALPHA_OUTPUT

增前导0 (Add leading zero)
DATA v_s(5).
UNPACK '123' to v_s. ==> v_s = '00123'
FM: CONVERSION_EXIT_ALPHA_INPUT

SHIFT dobj
[{BY num PLACES} | {UP TO sub_string}]
[LEFT|RIGHT] [CIRCULAR]
SHIFT dobj
{LEFT DELETING LEADING} | {RIGHT DELETING TRAILING} pattern.
[IN {BYTE|CHARACTER} MODE].

6. 字符串的长度, 内表的行数
STRLEN( dobj) 字符串的长度
LINES( itab ) 内表的行数

7. 删字符串中的空格: CONDENSE text [NO-GAPS].

8. 大小写转换,字符变换
TRANSLATE text {TO {UPPER|LOWER} CASE} | {USING pattern}.
eg: text = `Barbcbdbarb`.
TRANSLATE text USING 'ABBAabba'. =>'Abracadabra'

9. CONVERT
CONVERT DATE dat [TIME tim [DAYLIGHT SAVING TIME dst]]
INTO TIME STAMP time_stamp TIME ZONE tz.

CONVERT TIME STAMP time_stamp TIME ZONE tz
INTO [DATE dat] [TIME tim]
[DAYLIGHT SAVING TIME dst].

CONVERT TEXT text INTO SORTABLE CODE hex.

10. OVERLAY text1 WITH text2 [ONLY pattern].
如果不指定后面的ONLY pattern, text1中的空格会被text2中的对应字符替代
如果指定只有匹配的字符才会被替代,注意大小写敏感

11. 模式匹配
CO / CN contains only or not
CA / NA contains any or not any
CS / NS contain string or not
CP / NP contains pattern or not

NOTE:
a) . CO, NO, CA, NA比较时区分大小写, 并且尾部空格也在比较的范围之内
data: s1(10) value 'aabb'.
if s1 co 'ab' ==> false
if s1 co 'ab ' ==>true
CS, NS, CP, NP不区分大小写和尾部空格

b) .对于CP, NP
* = \s?
+ = \s
# 换码字符, 用于匹配 *, +这样的字符
##
#*
#+
#___ 比较结尾空格
#[a-z] 在CP, NP中强制区分大小写

c) . 比较结束后,如果结果为真,sy-fdpos将给出s2在s1中的偏移量信息

12. 特殊字符
在字符串中加入回车换行或TAB字符,在其他语言可以使用$13$10这样的ASCII码进行插入.但在ABAP中要使用sap的类CL_ABAP_CHAR_UTILITIES. 里面有字符常量:CR_LF,HORIZONTAL_TAB,NEWLINE等等.

13. 字符串位操作
DATA: v_s(10) value 'abcd'.
v_s+0(1) = 'b'.
v_s+2(*) = '12'.
=> v_s = 'bb12'.

<think>好的,我现在需要为用户介绍ABAP处理JSON字符串的方法。首先,我得回忆一下ABAP处理JSON的常用方式,以及相关的类和语法。ABAP从哪个版本开始支持JSON处理了呢?我记得可能是在7.40版本之后,引入了类CL_TREX_JSON_SERIALIZER和CL_TREX_JSON_DESERIALIZER,但后来可能有了更新更好的方法,比如使用XCO库或者系统标准类比如CL_SXML_READER和CL_SXML_WRITER。 接下来,用户可能需要知道如何将ABAP数据转换为JSON字符串,或者反过来。比如,如何将内表转换为JSON,或者解析JSON字符串到结构体。这时候,应该提到类CL_TREX_JSON_SERIALIZER和CL_TREX_JSON_DESERIALIZER的使用方法,或者更现代的SXML类。同时,可能需要注意这些类的限制,比如是否需要字段名称符合特定规则。 另外,可能还需要介绍手动拼接JSON字符串的情况,比如简单的例子,但提醒用户这种方法容易出错,不推荐复杂情况。同时,提到第三方库或工具的可能性,比如ZCL_JSON之类的开源解决方案,但需谨慎使用未经SAP认证的代码。 还要考虑用户的实际应用场景,比如在RESTful服务中处理JSON数据,或与外部系统交互的例子。比如使用HTTP客户端发送请求后解析JSON响应。这时候可能需要结合CL_HTTP_CLIENT的用法,或者使用ABAP的REST库。 另外,可能需要注意ABAP的版本差异,不同版本可能有不同的支持程度。比如,在较新的版本中,S/4 HANA可能提供了更便捷的JSON处理方法。同时,可能需要提到使用ABAP字符串函数处理转义字符,比如双引号、反斜杠的处理,避免JSON格式错误。 还需要举一些具体的例子,比如将结构体转换为JSON字符串,或者解析一个嵌套的JSON对象。比如,定义一个结构体,包含几个字段,然后用序列化类转换,展示生成的JSON字符串。或者,读取一个JSON数组到内表中。 还要提醒常见的错误,比如字段名的大小写问题,ABAP默认可能使用大写,而JSON通常是小写,如何处理字段映射的问题。可能需要使用注解或转换选项来指定字段名。 最后,总结一下推荐的几种方法,建议用户根据ABAP版本和需求选择合适的方式,并强调使用标准类库的优势,比如稳定性和维护性。</think>在ABAP处理JSON字符串主要有以下几种方式,以下内容基于ABAP 7.40+版本: ### 一、使用标准类库 #### 1. 序列化(ABAP→JSON) ```abap DATA: lv_json TYPE string. DATA(ls_data) = VALUE tys_structure( field1 = 'A' field2 = 123 ). CALL TRANSFORMATION id SOURCE data = ls_data RESULT XML lv_json. ``` #### 2. 反序列化(JSON→ABAP) ```abap DATA: ls_data TYPE tys_structure. CALL TRANSFORMATION id SOURCE XML lv_json RESULT data = ls_data. ``` ### 二、使用SXML库(更底层控制) ```abap DATA(reader) = cl_sxml_string_reader=>create( cl_abap_codepage=>convert_to( lv_json ) ). READER->read_next_node( ). IF reader->node_type = if_sxml_node=>co_nt_element_open. DATA(lv_name) = reader->get_name( ). ENDIF. ``` ### 三、手动处理(不推荐) ```abap CONCATENATE '{"name":"' lv_name '","age":' lv_age '}' INTO lv_json. ``` ### 四、注意事项 1. **字段映射** 使用注解控制字段名称: ```abap TYPES: BEGIN OF ty_user, name TYPE string JSON_NAME 'userName', age TYPE i, END OF ty_user. ``` 2. **日期格式** JSON日期建议统一转换为ISO8601格式: ```json "2023-08-25T14:30:00Z" ``` 3. **特殊字符处理** 使用`CL_ABAP_CONV_OUT_CE`处理转义: ```abap DATA(escaped) = cl_abap_conv_out_ce=>escape( val = lv_string format = cl_abap_conv_out_ce=>escape_json ). ``` ### 五、常用场景示例 #### 解析嵌套JSON: ```json { "department": "IT", "employees": [ {"name": "John", "skills": ["ABAP","Java"]}, {"name": "Alice", "skills": ["Fiori","Python"]} ] } ``` 对应ABAP结构: ```abap TYPES: BEGIN OF ty_skill, name TYPE string, END OF ty_skill, tt_skills TYPE STANDARD TABLE OF ty_skill WITH EMPTY KEY, BEGIN OF ty_employee, name TYPE string, skills TYPE tt_skills, END OF ty_employee, tt_employees TYPE STANDARD TABLE OF ty_employee WITH EMPTY KEY, BEGIN OF ty_department, department TYPE string, employees TYPE tt_employees, END OF ty_department. ``` ### 六、调试技巧 使用`CL_DEMO_OUTPUT=>DISPLAY_JSON`可视化显示JSON结构: ```abap cl_demo_output=>display_json( lv_json ). ``` 建议优先使用`CALL TRANSFORMATION`方式,其具有: - 自动类型转换 - 支持深层结构 - 处理循环引用 - 自动UTF-8编码转换 对于特殊需求(如自定义日期格式),可考虑结合正则表达式处理或使用第三方库如`/UI2/CL_JSON`(需确认系统可用性)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值