ABAP BTP环境中使用deserialize解析JSON数据失败求助
问题分析与解决方法
核心问题
解析后无数据的本质是JSON结构与ABAP定义的类型完全不匹配:
- 返回的JSON根节点是包含
records数组的对象,你直接将ty_data类型的内表作为反序列化目标,程序无法定位到有效数据节点。 - 业务字段(如
customer、customer_id)实际嵌套在JSON的fields子对象中,你的ty_data没有对应层级结构,无法提取嵌套字段。 - 部分字段名称映射存在偏差(如
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.
关键修正点
- 匹配JSON层级定义类型:新增
ty_fields、ty_record、ty_json_root三个类型,完全对应JSON的嵌套结构,确保反序列化时能正确识别数据位置。 - 字段映射处理:通过循环将嵌套在
fields中的业务字段提取到自定义的ty_data内表中,同时利用pretty_mode-user自动处理JSON下划线命名与ABAP命名的映射。 - 增加异常捕获:在请求和解析步骤添加异常处理,方便快速排查问题。
内容的提问来源于stack exchange,提问作者Srinivas chandu
相关产品推荐
相关产品推荐

