ABAP JSON字符串解析 JOSN转换为内表

文章详细展示了如何在ABAP中使用`cl_json`类解析JSON字符串,包括基本格式和复杂嵌套结构,并将结果存储到内表中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接开干:代码如下:拿去不谢

REPORT zgdm_json.


DATA: result      TYPE        string.

"============================================JSON 字段串解析 至 内表 ========begin ===============================
DATA: BEGIN OF itab OCCURS 0,
        msg  TYPE char200,
        code TYPE char10,
      END OF itab.

DATA: json_ser TYPE REF TO cl_trex_json_serializer,
      json_des TYPE REF TO cl_trex_json_deserializer.
DATA: jsonstr TYPE string.


"---JSON字段名称没双引号用这方法
FREE itab.
result = '[{msg: "测试JSON返回1111",code: 0}]'.
WRITE:/ '要解析的JSON:'.
WRITE: result.

CREATE OBJECT json_des.
CALL METHOD json_des->deserialize
  EXPORTING
    json = result
  IMPORTING
    abap = itab[].
WRITE:/ '转为内表后输出:'.
LOOP AT itab.
  WRITE:/ itab-msg .
  WRITE: itab-code.
ENDLOOP.


WRITE:/ '------------------------------------------------------'.

"---JSON字段名称有双引号用这方法
FREE itab.
result = '[{"msg": "测试JSON返回2222","code": 0}]'.
WRITE:/ '要解析的JSON:'.
WRITE: result.

/ui2/cl_json=>deserialize( EXPORTING json = result CHANGING data = itab[] ).
WRITE:/ '转为内表后输出:'.
LOOP AT itab.
  WRITE:/ itab-msg.
  WRITE: itab-code.
ENDLOOP.

WRITE:/ '------------------------------------------------------'.
"-------------------------------------------------------------------------------------------复杂级别 -- JSON ---解析---
***{
***      "R_RET_CODE": "0",
***      "R_RESP_DATA": [      {
***         "MORDER_NAME": "EA20X/总成开发",
***         "MORDER_CODE": "000011600918"
***      }]
***}
result = '{"R_RET_CODE": "0","R_RESP_DATA": [{"MORDER_NAME": "EA20X/总成开发","MORDER_CODE": "000011600918"}]}'.

WRITE:/ '要转换的JOSN字符:'.
WRITE: result.

TYPES:BEGIN OF ty_result,
        r_ret_code  TYPE char100,
        r_resp_data TYPE zit_test_resp_json,
        "--zit_test_resp_json类型为表类型,表类型的结构字段如下:
*        MORDER_NAME  类型  TXT50 CHAR  50  0 文本
*        MORDER_CODE  类型  TXT50 CHAR  50  0 文本
      END OF ty_result.
DATA:w_result TYPE ty_result.

DATA:wa_resp_data TYPE zwa_test_resp_json.
DATA:it_resp_data TYPE zit_test_resp_json.

/ui2/cl_json=>deserialize( EXPORTING json = result CHANGING data = w_result ).

WRITE:/ '转为内表后输出:'.
IF w_result-r_ret_code = '0'.

  WRITE:/ w_result-r_ret_code.
  it_resp_data[] = w_result-r_resp_data[].

  LOOP AT it_resp_data INTO wa_resp_data.
    WRITE: wa_resp_data-morder_name.
    WRITE: wa_resp_data-morder_code.
  ENDLOOP.

ENDIF.

<think>嗯,用户问的是如何在ABAP中将JSON字符串转换成内。首先,我需要回忆一下ABAP处理JSON的常用方法。记得ABAP有标准库可以用来解析JSON,比如类CL_TREX_JSON_SERIALIZER和CL_TREX_JSON_DESERIALIZER,但可能用户需要更具体的步骤。 首先,用户可能需要先定义一个结构符合JSON数据的内结构。例如,如果JSON是一个数组,包含多个对象,每个对象有字段比如name, age,那么内的结构体应该包含这些字段。然后,使用反序列化方法将JSON字符串转换ABAP的数据对象。 不过,现在可能有更推荐的方式,比如使用/UI2/CL_JSON这个类,因为它的方法更现代,比如DESERIALIZE方法。或者使用SXML库中的相关类,比如CL_SXML_STRING_READER和CL_SXML_JSON_PARSER。需要确认哪种方法更常用,避免使用过时的类。 另外,处理时要注意字段名称的大小写问题,因为JSON的键可能是小写,而ABAP的字段通常是大写。可能需要使用映射或者在反序列化时设置参数,比如CASE INSENSITIVE或者CAMEL CASE转换。 可能的步骤是:定义内和结构体,调用反序列化方法,将JSON字符串转换为内。需要给出具体的代码示例,包括数据定义和反序列化的调用。同时,可能需要处理异常,比如格式错误的JSON。 还要考虑用户是否了解如何安装或访问必要的类库,比如/UI2/CL_JSON是否属于需要额外安装的组件,或者是否在较新的ABAP版本中默认可用。如果用户使用的是较旧版本,可能需要不同的方法。 此外,是否需要处理嵌套结构或复杂类型的JSON?如果用户的数据结构比较复杂,可能需要更详细的步骤,比如使用转换运算符或者定义相应的ABAP结构。 总之,我需要提供一个清晰的示例代码,展示如何定义结构,使用合适的类进行反序列化,并处理可能的字段名称转换问题。同时,提醒用户注意异常处理和版本兼容性。</think>在 ABAP 中将 JSON 字符串转换为内的实现步骤如下(示例代码使用现代 ABAP 语法): ```abap DATA: lv_json TYPE string, lt_data TYPE STANDARD TABLE OF zst_person. " 假设自定义结构体 ZST_PERSON " 示例 JSON 字符串 lv_json = '[{"name":"张三","age":25},{"name":"李四","age":30}]'. " 推荐使用 /UI2/CL_JSON解析 TRY. /ui2/cl_json=>deserialize( EXPORTING json = lv_json pretty_name = /ui2/cl_json=>pretty_mode-camel_case " 处理驼峰命名 assoc_arrays = abap_true " 自动转换为内 CHANGING data = lt_data ). CATCH cx_root INTO DATA(lx_exc). WRITE: '解析错误:', lx_exc->get_text( ). RETURN. ENDTRY. " 输出验证 LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<ls_data>). WRITE: / <ls_data>-name, <ls_data>-age. ENDLOOP. ``` **关键步骤说明:** 1. **数据结构定义**: 需创建与 JSON 结构匹配的 ABAP 结构: ```abap TYPES: BEGIN OF zst_person, name TYPE string, age TYPE i, END OF zst_person. ``` 2. **命名转换处理**: - 使用 `pretty_name = /ui2/cl_json=>pretty_mode-camel_case` 自动处理驼峰命名转换 - 如果字段名不一致,可使用注解指定映射: ```abap TYPES: BEGIN OF zst_person, name TYPE string **json** "name", age TYPE i **json** "age", END OF zst_person. ``` 3. **特殊类型处理**: - 日期类型需使用 `sy-datum` 格式字符串 - 金额字段建议用字符串类型接收后转换 **扩展场景处理**: 1. **处理复杂嵌套结构**: ```abap " 示例嵌套 JSON lv_json = '{"department":"IT","employees":[{"name":"王五","skills":["ABAP","Fiori"]}]}'. TYPES: BEGIN OF zst_skill, name TYPE string, END OF zst_skill, BEGIN OF zst_employee, name TYPE string, skills TYPE STANDARD TABLE OF zst_skill WITH EMPTY KEY, END OF zst_employee, BEGIN OF zst_department, department TYPE string, employees TYPE STANDARD TABLE OF zst_employee WITH EMPTY KEY, END OF zst_department. DATA ls_dept TYPE zst_department. /ui2/cl_json=>deserialize( EXPORTING json = lv_json CHANGING data = ls_dept ). ``` 2. **自定义转换规则**: 可通过实现 `IF_SERIALIZABLE_OBJECT` 接口创建自定义转换类,处理特殊逻辑 **注意事项**: 1. 确保 JSON 格式正确(可使用在线校验工具预处理) 2. 推荐使用 ABAP 7.40 及以上版本(支持现代语法) 3. 处理大数据量时建议分块解析 4. 敏感数据需做防注入处理 如需处理 XML 格式转换ABAP 还提供 `sxml` 相关类库(如 `cl_sxml_string_reader`)可实现 XML/JSON
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被挤的奶牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值