You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ABAP BTP环境中使用deserialize解析JSON数据失败求助

问题分析与解决方法

核心问题

解析后无数据的本质是JSON结构与ABAP定义的类型完全不匹配:

  1. 返回的JSON根节点是包含records数组的对象,你直接将ty_data类型的内表作为反序列化目标,程序无法定位到有效数据节点。
  2. 业务字段(如customer、customer_id)实际嵌套在JSON的fields子对象中,你的ty_data没有对应层级结构,无法提取嵌套字段。
  3. 部分字段名称映射存在偏差(如date_Created对应JSON的date_created),不过这是次要问题,核心矛盾是结构不匹配。

修正后的代码

CLASS zcode_82 DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.
    INTERFACES if_oo_adt_classrun .
    DATA: lv_response TYPE string.

    " 定义完全匹配JSON结构的类型
    TYPES: BEGIN OF ty_fields,
             customer_id   TYPE string,
             address       TYPE string,
             created_time  TYPE string,
             customer      TYPE string,
             date_created  TYPE string,
           END OF ty_fields.

    TYPES: BEGIN OF ty_record,
             id           TYPE string,
             createdTime  TYPE string,
             fields       TYPE ty_fields,
           END OF ty_record.

    TYPES: BEGIN OF ty_json_root,
             records TYPE STANDARD TABLE OF ty_record WITH DEFAULT KEY,
           END OF ty_json_root.

    " 自定义输出用的内表类型
    TYPES: BEGIN OF ty_data,
             id           TYPE string,
             customer     TYPE string,
             customer_id  TYPE string,
             address      TYPE string,
             date_created TYPE string,
             time_created TYPE string,
           END OF ty_data.

    DATA: lv_json_root TYPE ty_json_root,
          lv_data      TYPE STANDARD TABLE OF ty_data WITH DEFAULT KEY.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.


CLASS zcode_82 IMPLEMENTATION.

  METHOD if_oo_adt_classrun~main.
    TRY.
        " 创建HTTP目标(替换为实际API地址)
        DATA(lo_http_destination) =
             cl_http_destination_provider=>create_by_url( 'your_actual_api_url' ).

        " 创建HTTP客户端
        DATA(lo_web_http_client) = cl_web_http_client_manager=>create_by_http_destination( lo_http_destination ) .
        " 设置请求头(替换为实际有效Token)
        DATA(lo_web_http_request) = lo_web_http_client->get_http_request( ).
        lo_web_http_request->set_header_fields( VALUE #(
          ( name = 'Authorization' value = 'Bearer your_actual_token' )
          ( name = 'Content-Type' value = 'application/json' )
        ) ).
        " 执行GET请求
        DATA(lo_web_http_response) = lo_web_http_client->execute( if_web_http_client=>get ).
        lv_response = lo_web_http_response->get_text( ).
      CATCH cx_http_dest_provider_error cx_web_http_client_error cx_web_message_error.
        out->write( '请求失败,请检查连接或权限配置' ).
        RETURN.
    ENDTRY.

    " 反序列化到匹配JSON结构的变量
    CLEAR lv_json_root.
    TRY.
        /ui2/cl_json=>deserialize(
          EXPORTING
            json          = lv_response
            pretty_name   = /ui2/cl_json=>pretty_mode-user " 自动处理下划线与常规命名的映射
          CHANGING
            data          = lv_json_root
        ).
      CATCH cx_root.
        out->write( 'JSON解析失败,请检查响应格式是否正确' ).
        RETURN.
    ENDTRY.

    " 将嵌套结构的数据映射到自定义输出内表
    LOOP AT lv_json_root-records INTO DATA(ls_record).
      APPEND VALUE ty_data(
        id           = ls_record-id
        customer     = ls_record-fields-customer
        customer_id  = ls_record-fields-customer_id
        address      = ls_record-fields-address
        date_created = ls_record-fields-date_created
        time_created = ls_record-fields-created_time
      ) TO lv_data.
    ENDLOOP.

    " 输出最终结果
    out->write( lv_data ).
  ENDMETHOD.
ENDCLASS.

关键修正点

  1. 匹配JSON层级定义类型:新增ty_fields、ty_record、ty_json_root三个类型,完全对应JSON的嵌套结构,确保反序列化时能正确识别数据位置。
  2. 字段映射处理:通过循环将嵌套在fields中的业务字段提取到自定义的ty_data内表中,同时利用pretty_mode-user自动处理JSON下划线命名与ABAP命名的映射。
  3. 增加异常捕获:在请求和解析步骤添加异常处理,方便快速排查问题。

内容的提问来源于stack exchange,提问作者Srinivas chandu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:05:26