SAP ABAP JSON格式转ABAP内表

该文展示了在ABAP编程中如何使用/UI2/CL_JSON类进行JSON反序列化,将JSON字符串转换为数据表,并通过LOOPAT循环遍历处理记录,包括两种不同的JSON结构示例。

实例1

TYPES: BEGIN OF T_RECORD1,
         NUMNO    TYPE CHAR10,
         PRODNAME TYPE CHAR50,
       END OF T_RECORD1.
DATA: JSON1 TYPE STRING.
DATA : RECORD1 TYPE TABLE OF T_RECORD1 WITH HEADER LINE .
 
JSON1 = '[{"NumNo":"001","ProdName":"Fert01"},{"NumNo":"002","ProdName":"Fert02"}]'.
 
/UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = JSON1
                                     PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE
                            CHANGING DATA = RECORD1[] ).
 
LOOP AT RECORD1.
  WRITE : / RECORD1-NUMNO,RECORD1-PRODNAME.
ENDLOOP.

实例2

DATA : BEGIN OF LS_RECORD,
         DATALIST TYPE TABLE OF ZDATALIST_DETAIL,
       END OF LS_RECORD.
DATA: JSON TYPE STRING.
DATA : RECORD2 TYPE ZDATALIST WITH HEADER LINE.
 
JSON = '{"dataList":[{"NumNo":"001","ProdName":"Fert01"},{"NumNo":"002","ProdName":"Fert02"}]}'.
 
/UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = JSON
                                     PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE
                            CHANGING DATA = LS_RECORD ).
 
IF LS_RECORD-DATALIST IS NOT INITIAL.
  RECORD2[] = LS_RECORD-DATALIST.
ENDIF.
 
LOOP AT RECORD2.
WRITE : / RECORD2-NUMNO,RECORD2-PRODNAME.
ENDLOOP.

 

 

### SAP ABAP中将数据结构换为JSON格式的方法 在SAP ABAP环境中,可以通过系统自带的标准类`/UI2/CL_JSON`来完成ABAP数据结构与JSON之间的相互换。以下是具体的操作方式及其注意事项。 #### 使用标准类 `/UI2/CL_JSON` 该类提供了两个核心方法用于处理JSON数据: 1. **序列化 (Serialize)** 将ABAP内部或结构体换为JSON字符串。 ```abap DATA: lv_json TYPE string, ls_data TYPE zyour_structure. " 填充ls_data... CALL METHOD /ui2/cl_json=>serialize EXPORTING json = ls_data RECEIVING data = lv_json. ``` 上述代码片段展示了如何通过调用`/ui2/cl_json=>serialize`方法将ABAP结构体`ls_data`换为JSON字符串`lv_json`[^1]。 2. **反序列化 (Deserialize)** 将JSON字符串解析并填充到ABAP内部或结构体中。 ```abap DATA: lv_json TYPE string, ls_data TYPE zyour_structure. " 设置lv_json为有效的JSON字符串... CALL METHOD /ui2/cl_json=>deserialize EXPORTING json = lv_json CHANGING data = ls_data. ``` 此处展示的是如何利用`/ui2/cl_json=>deserialize`方法将JSON字符串`lv_json`解析至ABAP结构体`ls_data`中。 #### 预定义ABAP数据结构的重要性 需要注意的是,在使用上述两种方法时,都需要预先定义好相应的ABAP数据结构。这是因为ABAP是一种强类型语言,而JSON本身是弱类型的键值对集合。这种差异使得在进行JSONABAP数据结构之间换时,必须明确指定目标数据结构的字段名称和类型。 对于复杂的数据结构或者嵌套层次较深的情况,手动定义这些结构可能会变得繁琐且容易出错。此时可以考虑借助一些自动化工具或脚本来辅助生成所需的ABAP数据字典对象。 #### 示例场景:HTTP POST 请求中的应用 当向外部服务发起HTTP POST请求时,通常需要以JSON格式传递请求主体内容。下面是一个简单的例子说明如何构建这样的请求: ```abap DATA: lo_http_client TYPE REF TO if_http_client, lv_request_body TYPE string. TRY. CREATE OBJECT lo_http_client EXPORTING host = 'example.com' port = 80. " 构建JSON请求体 DATA(ls_payload) = VALUE zpayload( field1 = 'value1' field2 = 'value2' ). CALL METHOD /ui2/cl_json=>serialize EXPORTING json = ls_payload RECEIVING data = lv_request_body. lo_http_client->request->set_cdata( lv_request_body ). lo_http_client->send( ). CATCH cx_root INTO DATA(lx_error). WRITE: / lx_error->get_text( ). ENDTRY. ``` 在此示例中,先创建了一个HTTP客户端实例,并设置了目标主机地址;接着通过前述提到的序列化过程得到JSON形式的请求体;最后将其设置给HTTP请求对象并发送出去[^2]。 ### 总结 综上所述,虽然ABAP环境下的JSON操作已经相对成熟稳定,但在实际运用当中仍需注意适配各自业务需求的具体情况作出相应调整优化。例如针对复杂的多层次数据模型可能还需要额外探索更高效的解决方案路径。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值