当前位置: 首页 > news >正文

ABAP JSON处理应用

1. json 转换成内表

通过上传URL获取json数据并转换为内表

json to itab关键字

  METHOD get_itab_for_json.DATA : lr_client       TYPE REF TO if_http_client,lv_url          TYPE string,lv_content_type TYPE string VALUE 'application/x-www-form-urlencoded',ev_xstring      TYPE xstring,ex_string       TYPE string.IF iv_guid IS INITIAL.ev_msg = 'GUID不能为空!'.RETURN.ENDIF."get urllv_url = zcl_wd_json=>get_system_url(iv_system = 'DMS'iv_action = 'GET_FILES' ).IF lv_url IS INITIAL.ev_msg = '未获取到URL!'.RETURN.ENDIF."get APIKEYDATA(lv_apikey) = zcl_wd_json=>get_system_url(iv_system = 'DMS'iv_action = 'APIKEY' ).lv_url = lv_url && iv_guid && |&{ lv_apikey }|.TRY ."创建http对象cl_http_client=>create_by_url(EXPORTINGurl                = lv_urlIMPORTINGclient             = lr_clientEXCEPTIONSargument_not_found = 1plugin_not_active  = 2internal_error     = 3OTHERS             = 4 ).* set protocol versionCALL METHOD lr_client->request->set_header_fieldEXPORTINGname  = '~server_protocol'value = 'HTTP/1.1'.
* 提交方式CALL METHOD lr_client->request->set_header_fieldEXPORTINGname  = '~request_method'value = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencodedCALL METHOD lr_client->request->set_header_fieldEXPORTINGname  = 'Content-Type'value = lv_content_type.* 填充参数
*  CLEAR lv_len.
*  lv_len = strlen( iv_json ).
*  IF lv_len GT 0.
*    CALL METHOD lr_client->request->set_cdata   " Removed APPEND_CDATA
*      EXPORTING
*        data   = iv_json
*        offset = 0
*        length = lv_len.
*  ENDIF.* 发送CALL METHOD lr_client->sendEXPORTINGtimeout                    = 200EXCEPTIONShttp_communication_failure = 1http_invalid_state         = 2http_processing_failed     = 3OTHERS                     = 4.IF sy-subrc NE 0.lr_client->get_last_error(IMPORTINGmessage = ev_msg).RETURN.ENDIF.* 获取返回CALL METHOD lr_client->receiveEXCEPTIONShttp_communication_failure = 1http_invalid_state         = 2http_processing_failed     = 3.IF sy-subrc NE 0.lr_client->get_last_error(IMPORTINGmessage = ev_msg).RETURN.ENDIF.* 返回
*  CLEAR: lv_xjson .ev_xstring = lr_client->response->get_data( ).* XSTRING to STRINGCALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'EXPORTINGim_xstring  = ev_xstringim_encoding = 'UTF-8'IMPORTINGex_string   = ex_string.*    "json to itabCALL TRANSFORMATION idSOURCE XML ex_stringRESULT status = es_json-statusmsg = es_json-msgrows = es_json-rows.CATCH cx_abapcg_exception  .ev_msg = '异常'.ENDTRY.* 关闭链接ielr_client->close( ).ENDMETHOD.

ZTABURL01 外围系统URL配置表

  METHOD get_system_url.
    SELECT  SINGLE url INTO ev_url FROM ztaburl01
      WHERE syst = iv_system
        AND action = iv_action.
  ENDMETHOD.

2.JSON序列化

   class-methods SERIALIZE
    importing
      !DATA type DATA
      !COMPRESS type BOOL default C_BOOL-FALSE
      !NAME type STRING optional
      !PRETTY_NAME type PRETTY_NAME_MODE default PRETTY_MODE-NONE
      !TYPE_DESCR type ref to CL_ABAP_TYPEDESCR optional
      !ASSOC_ARRAYS type BOOL default C_BOOL-FALSE
      !TS_AS_ISO8601 type BOOL default C_BOOL-FALSE
      !EXPAND_INCLUDES type BOOL default C_BOOL-TRUE
      !ASSOC_ARRAYS_OPT type BOOL default C_BOOL-FALSE
      !NUMC_AS_STRING type BOOL default C_BOOL-FALSE
      !NAME_MAPPINGS type NAME_MAPPINGS optional
    returning
      value(R_JSON) type JSON .

METHOD serialize.

*    " **********************************************************************
*    "! Usage examples and documentation can be found on SCN:
*    " http://wiki.scn.sap.com/wiki/display/Snippets/One+more+ABAP+to+JSON+Serializer+and+Deserializer
*    " **********************************************************************  "

    DATA: lo_json  TYPE REF TO zcl_json.

    CREATE OBJECT lo_json
      EXPORTING
        compress         = compress
        pretty_name      = pretty_name
        name_mappings    = name_mappings
        assoc_arrays     = assoc_arrays
        assoc_arrays_opt = assoc_arrays_opt
        expand_includes  = expand_includes
        numc_as_string   = numc_as_string
        ts_as_iso8601    = ts_as_iso8601.

    r_json = lo_json->serialize_int( name = name data = data type_descr = type_descr ).

  ENDMETHOD.       

3. 应用

3.1 SAP 获取销售系统的交房日期

FUNCTION ZFIFM_PI1225.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IT_PI1225_01) TYPE  ZTPI1225_01
*"  TABLES
*"      ET_ZTPI1225 TYPE  ZTPI1225
*"----------------------------------------------------------------------DATA LS_SEND              TYPE ZVKDT_ECC_BASE_FORM.DATA LS_RECEIVE           TYPE ZVKDT_PI1225_FWJDELVDATE_QUER4.DATA LS_BIZPARAM          TYPE ZPI1225_SBIZPARM.DATA LT_ZTTANDCRITERIA    TYPE ZTPI1225_ANDCRITERIA.DATA LT_ZTRETURNPUBPROPS  TYPE ZTPI1225_RETURNPUBPROPS.DATA LT_MAPPING           TYPE ZCL_JSON=>NAME_MAPPINGS.DATA LR_EXCEPTION         TYPE REF TO CX_AI_SYSTEM_FAULT.DATA LCL_FAULT            TYPE REF TO CX_AI_SYSTEM_FAULT.DATA LV_ERROR_TXT         TYPE STRING.DATA LS_ZTPI1225          TYPE LINE OF ZTPI1225."根据房源内码取数据LT_ZTTANDCRITERIA   = VALUE #( ( FIELDCODE = 'innerId' VALUETYPE = 'String' VALUES = IT_PI1225_01 ) )."返回四个日期字段APPEND 'actualPayDate'      TO LT_ZTRETURNPUBPROPS.APPEND 'noticeDate'         TO LT_ZTRETURNPUBPROPS.APPEND 'focusPayDateStart'  TO LT_ZTRETURNPUBPROPS.APPEND 'focusPayDateEnd'    TO LT_ZTRETURNPUBPROPS.LS_BIZPARAM-QUERYCRITERIA-CRITERIA-ANDCRITERIA = LT_ZTTANDCRITERIA.LS_BIZPARAM-PAGENO = 1.LS_BIZPARAM-RETURNAPPPROPS = LT_ZTRETURNPUBPROPS.LS_BIZPARAM-PAGESIZE = 500.LS_BIZPARAM-CATEGORYID = '10003'."和中台接口字段对应关系LT_MAPPING = VALUE #( ( ABAP = `EXTATTRRETURNTYPE`  JSON = `extAttrReturnType`  )( ABAP = `QUERYCRITERIA`      JSON = `queryCriteria`      )( ABAP = `CRITERIA`           JSON = `criteria`           )( ABAP = `ANDCRITERIA`        JSON = `andCriteria`        )( ABAP = `FIELDCODE`          JSON = `fieldCode`          )( ABAP = `VALUETYPE`          JSON = `valueType`          )( ABAP = `VALUES`             JSON = `values`             )( ABAP = `RETURNAPPPROPS`     JSON = `returnAppProps`     )( ABAP = `PAGENO`             JSON = `pageNo`             )( ABAP = `PAGESIZE`           JSON = `pageSize`           )( ABAP = `CATEGORYID`         JSON = `categoryId`         ) )."BIZ_PARAM 参数业务jsonLS_SEND-I_REQUEST-MESSAGE-DATA-R-BIZ_PARAM = ZCL_JSON=>SERIALIZE( DATA = LS_BIZPARAM NAME_MAPPINGS = LT_MAPPING ).* MD5加处理CALL FUNCTION 'ZFM_FI_ZT_SECRET_MD5'CHANGINGIS_SEND = LS_SEND.TRY.CALL FUNCTION 'ZABI_0001'EXPORTINGIV_ITFID          = 'PI1225_FWJDELVDATE_QUERY'IV_IMPORT         = LS_SENDIMPORTINGEV_EXPORT         = LS_RECEIVEEXCEPTIONSCALL_PROXY_FAILED = 1OTHERS            = 2.CATCH CX_AI_SYSTEM_FAULT INTO LCL_FAULT.LV_ERROR_TXT = LCL_FAULT->GET_TEXT( ).SY-SUBRC = 4.ENDTRY.DATA LO_XML     TYPE REF TO CL_XML_DOCUMENT.DATA LV_RC      TYPE SY-SUBRC." 处理返回数据READ TABLE LS_RECEIVE-E_RESPONSE-RETURNSTATUS-DATA INTO DATA(LS_DATA) INDEX 1.IF SY-SUBRC = 0.LOOP AT LS_DATA-LIST INTO DATA(LS_LIST) WHERE INNER_ID IS NOT INITIAL.IF LS_LIST-PROP_MAP IS NOT INITIAL.REPLACE 'fwj_focusPayDateStart' WITH 'FWJ_FOCUSPAYDATESTART' INTO LS_LIST-PROP_MAP.REPLACE '/fwj_focusPayDateStart' WITH '/FWJ_FOCUSPAYDATESTART' INTO LS_LIST-PROP_MAP.REPLACE 'fwj_focusPayDateEnd' WITH 'FWJ_FOCUSPAYDATEEND' INTO LS_LIST-PROP_MAP.REPLACE '/fwj_focusPayDateEnd' WITH '/FWJ_FOCUSPAYDATEEND' INTO LS_LIST-PROP_MAP.REPLACE 'fwj_actualPayDate' WITH 'FWJ_ACTUALPAYDATE' INTO LS_LIST-PROP_MAP.REPLACE '/fwj_actualPayDate' WITH '/FWJ_ACTUALPAYDATE' INTO LS_LIST-PROP_MAP.REPLACE 'fwj_noticeDate' WITH 'FWJ_NOTICEDATE' INTO LS_LIST-PROP_MAP.REPLACE '/fwj_noticeDate' WITH '/FWJ_NOTICEDATE' INTO LS_LIST-PROP_MAP.CREATE OBJECT LO_XML.CALL METHOD LO_XML->PARSE_STRINGEXPORTINGSTREAM  = LS_LIST-PROP_MAPRECEIVINGRETCODE = LV_RC.CALL METHOD LO_XML->GET_DATACHANGINGDATAOBJECT = LS_ZTPI1225.ENDIF.FIND 'FWJ_FOCUSPAYDATESTART' IN LS_LIST-PROP_MAP.IF SY-SUBRC <> 0.
*        LS_ZTPI1225-FWJ_FOCUSPAYDATESTART = '99991231'.LS_ZTPI1225-FWJ_FOCUSPAYDATESTART = ''.ELSE.LS_ZTPI1225-FWJ_FOCUSPAYDATESTART = LS_ZTPI1225-FWJ_FOCUSPAYDATESTART+0(4) && LS_ZTPI1225-FWJ_FOCUSPAYDATESTART+5(2) && LS_ZTPI1225-FWJ_FOCUSPAYDATESTART+8(2).ENDIF.FIND 'FWJ_FOCUSPAYDATEEND' IN LS_LIST-PROP_MAP.IF SY-SUBRC <> 0.
*        LS_ZTPI1225-FWJ_FOCUSPAYDATEEND = '99991231'.LS_ZTPI1225-FWJ_FOCUSPAYDATEEND = ''.ELSE.LS_ZTPI1225-FWJ_FOCUSPAYDATEEND = LS_ZTPI1225-FWJ_FOCUSPAYDATEEND+0(4) && LS_ZTPI1225-FWJ_FOCUSPAYDATEEND+5(2) && LS_ZTPI1225-FWJ_FOCUSPAYDATEEND+8(2).ENDIF.FIND 'FWJ_ACTUALPAYDATE' IN LS_LIST-PROP_MAP.IF SY-SUBRC <> 0.
*        LS_ZTPI1225-FWJ_ACTUALPAYDATE = '99991231'.LS_ZTPI1225-FWJ_ACTUALPAYDATE = ''.ELSE.LS_ZTPI1225-FWJ_ACTUALPAYDATE = LS_ZTPI1225-FWJ_ACTUALPAYDATE+0(4) && LS_ZTPI1225-FWJ_ACTUALPAYDATE+5(2) && LS_ZTPI1225-FWJ_ACTUALPAYDATE+8(2).ENDIF.FIND 'FWJ_NOTICEDATE' IN LS_LIST-PROP_MAP.IF SY-SUBRC <> 0.
*        LS_ZTPI1225-FWJ_NOTICEDATE = '99991231'.LS_ZTPI1225-FWJ_NOTICEDATE = ''.ELSE.LS_ZTPI1225-FWJ_NOTICEDATE = LS_ZTPI1225-FWJ_NOTICEDATE+0(4) && LS_ZTPI1225-FWJ_NOTICEDATE+5(2) && LS_ZTPI1225-FWJ_NOTICEDATE+8(2).ENDIF.LS_ZTPI1225-INNER_ID = LS_LIST-INNER_ID.APPEND LS_ZTPI1225 TO ET_ZTPI1225.ENDLOOP.ENDIF.* 如果房源没有到日期,补个空值SORT ET_ZTPI1225 BY INNER_ID.CLEAR LS_ZTPI1225.LOOP AT IT_PI1225_01 INTO DATA(LV_INNER_ID).READ TABLE ET_ZTPI1225 TRANSPORTING NO FIELDS WITH KEY INNER_ID = LV_INNER_ID BINARY SEARCH.IF SY-SUBRC <> 0.LS_ZTPI1225-INNER_ID = LV_INNER_ID.APPEND LS_ZTPI1225 TO ET_ZTPI1225.ENDIF.ENDLOOP.SORT ET_ZTPI1225 BY INNER_ID.ENDFUNCTION.

接口中台对接MD5加密

FUNCTION ZFM_FI_ZT_SECRET_MD5.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_KEY) TYPE  STRING DEFAULT 
*"  EXPORTING
*"     REFERENCE(EV_CIPHERTEXT) TYPE  STRING
*"  CHANGING
*"     REFERENCE(IS_SEND) TYPE  ZVKDT_ECC_BASE_FORM
*"----------------------------------------------------------------------DATA LV_PLAINTEXT      TYPE STRING.DATA LV_DATUM          TYPE CHAR10.DATA LV_UZEIT          TYPE CHAR10.DATA LS_ZTAB0041       TYPE ZTAB0041.LV_DATUM = SY-DATUM+0(4) && '-' && SY-DATUM+4(2) && '-' && SY-DATUM+6(2).WRITE SY-UZEIT TO LV_UZEIT." 通用参数设置SELECT SINGLE * FROM ZTAB0041 INTO LS_ZTAB0041.IS_SEND-I_REQUEST-MESSAGE-DATA-R-V           = LS_ZTAB0041-VERSION.IS_SEND-I_REQUEST-MESSAGE-DATA-R-APP_ID      = LS_ZTAB0041-APPID.IS_SEND-I_REQUEST-MESSAGE-DATA-R-DOMAIN      = LS_ZTAB0041-ZDOMAIN.IS_SEND-I_REQUEST-MESSAGE-DATA-R-USER_DOMAIN = LS_ZTAB0041-USER_DOMAIN.IS_SEND-I_REQUEST-MESSAGE-DATA-R-SIGN_METHOD = 'md5'.IS_SEND-I_REQUEST-MESSAGE-DATA-R-REQ_ID      = LS_ZTAB0041-REQ_ID.CONCATENATE LV_DATUM LV_UZEIT INTO IS_SEND-I_REQUEST-MESSAGE-DATA-R-TIMESTAMP SEPARATED BY SPACE." 输入参数处理LV_PLAINTEXT = LS_ZTAB0041-APPSECRET&& 'appId'      && IS_SEND-I_REQUEST-MESSAGE-DATA-R-APP_ID&& 'bizParam'   && IS_SEND-I_REQUEST-MESSAGE-DATA-R-BIZ_PARAM&& 'domain'     && IS_SEND-I_REQUEST-MESSAGE-DATA-R-DOMAIN&& 'reqId'      && IS_SEND-I_REQUEST-MESSAGE-DATA-R-REQ_ID&& 'signMethod' && IS_SEND-I_REQUEST-MESSAGE-DATA-R-SIGN_METHOD&& 'timestamp'  && IS_SEND-I_REQUEST-MESSAGE-DATA-R-TIMESTAMP&& 'userDomain' && IS_SEND-I_REQUEST-MESSAGE-DATA-R-USER_DOMAIN&& 'v'          && IS_SEND-I_REQUEST-MESSAGE-DATA-R-V&& LS_ZTAB0041-APPSECRET." MD5 加密处理CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'EXPORTINGALG        = 'MD5'DATA       = LV_PLAINTEXTIMPORTINGHASHSTRING = IS_SEND-I_REQUEST-MESSAGE-DATA-R-SIGN.
ENDFUNCTION.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CKAD-CronJob
  • 伟易特发布全新一代便携式反无人机装备
  • Vue组件:动态组件、缓存组件、异步组件
  • CentOs7 解决yum更新源报错:[Errno 14] HTTP Error 404 - Not Found 正在尝试其它镜像。
  • 微信小程序登录与获取手机号 (Python)
  • 计算机毕业设计Spark+PyTorch知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计
  • opencv学习:信用卡卡号识别
  • 别总是“系统错误,请稍后重试!”了,解决问题要彻底!
  • 铲屎官都该知道的除浮毛神器——希喂、美的、352宠物空气净化器
  • Python VTK 绘制等高线初步
  • image.size()和image.shape包含的信息一样,那image.size()存在的意义是什么?
  • 2024.9.9(极客大挑战 2019]EasySQL,[极客大挑战 2019]Knife)
  • 什么是3PL EDI 集成?优化供应链指南
  • springboot请求传参常用模板
  • CSS属性选择器选择属性值中包含指定字符串的元素
  • ESLint简单操作
  • git 常用命令
  • Java Agent 学习笔记
  • Javascript设计模式学习之Observer(观察者)模式
  • Java精华积累:初学者都应该搞懂的问题
  • js作用域和this的理解
  • mysql外键的使用
  • node.js
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何胜任知名企业的商业数据分析师?
  • 思考 CSS 架构
  • 我的zsh配置, 2019最新方案
  • 一、python与pycharm的安装
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #Lua:Lua调用C++生成的DLL库
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (C++17) optional的使用
  • (C++20) consteval立即函数
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (分布式缓存)Redis分片集群
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (七)Flink Watermark
  • (三)SvelteKit教程:layout 文件
  • (十三)Flask之特殊装饰器详解
  • (五)关系数据库标准语言SQL
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net - 类的介绍
  • .net core Redis 使用有序集合实现延迟队列