ABAP JSON 转内表

例子:获取数据响应如下:

{
    "code":"10000",
    "subCode":"10000",
    "msg":"success",
    "subMsg":"success",
    "data":{
        "datas":[
            {
                "projectId":0,
                "projectName":"",
                "userFullName":"",
                "userId":"",
                "joinMethod":0,
                "joinTime":"",
                "startStudyTime":"",
                "completedAllTime":"",
                "lastStudyTime":"",
                "schedule":"",
                "completed":0,
                "completeTaskAll":0,
                "completeTaskCompulsory":0,
                "completeTaskElective":0,
                "projectScore":0,
                "passed":0,
                "projectComments":"",
                "outStanding":0,
                "point":0,
                "score":0,
                "totalDuration":0,
                "deleted":0,
                "removeStatus":0,
                "userDeleted":0,
                "userStatus":0,
                "thirdUserId":"BH89757",
                "periods":[
                    {
                        "id":0,
                        "name":"",
                        "tasks":[
                            {
                                "taskId":0,
                                "taskName":"",
                                "rate":0,
                                "point":0,
                                "score":0,
                                "duration":0,
                                "startTime":"",
                                "completedTime":"",
                                "delay":0,
                                "achievement":0,
                                "passed":0,
                                "attendance":0,
                                "taskType":9
                            }
                        ]
                    }
                ]
            }
        ],
        "paging":{
            "count":0,
            "limit":0,
            "offset":0,
            "pages":0
        }
    }
}

转换代码大致如下:

 TYPES: BEGIN OF ty_final,
             userid           TYPE string,
             completedalltime TYPE string,
           END OF ty_final.
           
    DATA: ls_final    TYPE ty_final,
          lt_final    TYPE TABLE OF ty_final,
          lt_header TYPE  tihttpnvp,
          ls_header TYPE  ihttpnvp.

    DATA: lt_fields TYPE tihttpnvp,
          go_alv    TYPE REF TO cl_salv_table,
          lv_msg    TYPE string.
    DATA:
      lv_json  TYPE string,  "返回参数
      lv_json3 TYPE string,  "传输报文
      json_des TYPE REF TO cl_trex_json_deserializer,
      lv_json1 TYPE string, "获取传回值数据
      lv_json2 TYPE string.  "获取传回值数据
 
    FIELD-SYMBOLS:
      <data>        TYPE data,
      <results>     TYPE ANY TABLE,
      <structure>   TYPE any,
      <table>       TYPE ANY TABLE,
      <field>       TYPE any,
      <prod_tab>    TYPE any,
      <prod_tab1>   TYPE any,
      <field_value> TYPE data.

  CLEAR: ls_header.
    ls_header-name = 'Authorization'.
    ls_header-value = lv_token.
    APPEND  ls_header TO lt_header.
    CLEAR: ls_header.
    ls_header-name = 'Content-Type'.
    ls_header-value = 'application/json; charset=utf-8'.
    APPEND  ls_header TO lt_header.
    CLEAR:url.
    
      url =  '*************************************8'.


*--------------------------------------------------------------------------------------------------------

    "创建http客户端
    CALL METHOD cl_http_client=>create_by_url
      EXPORTING
        url                = url
      IMPORTING
        client             = http_client
      EXCEPTIONS
        argument_not_found = 1
        plugin_not_active  = 2
        internal_error     = 3
        OTHERS             = 4.

    "设定传输请求内容格式以及编码格式
    http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).
    http_client->request->set_method( if_http_request=>co_request_method_post ).
    "设置传输头
    CALL METHOD http_client->request->set_header_fields
      EXPORTING
        fields = lt_header.

    "设置调用方法
    CALL METHOD http_client->request->set_header_field
      EXPORTING
        name  = '~request_method'
        value = 'POST'.

*--------------------------------------------------------------------------------------------------------
    CLEAR :lt_res,lv_header .
    CLEAR: lv_json3.
    lv_json3 = '{ "limit": 99 }'.

    "设置待传输内容长度
    len = strlen( lv_json3 ).

    "设置传入字符串
    CALL METHOD http_client->request->set_cdata
      EXPORTING
        data   = lv_json3
        offset = 0
        length = len.

    "发送
    CALL METHOD http_client->send
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3
        http_invalid_timeout       = 4
        OTHERS                     = 5.


    IF sy-subrc <> 0.
      "操作失败,获取失败原因
      http_client->get_last_error( IMPORTING message = lv_result ).
      EXIT.
    ENDIF.

    "接收
    CALL METHOD http_client->receive
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3.

    CLEAR:lv_result.
    IF sy-subrc <> 0 .
      http_client->get_last_error( IMPORTING message = lv_result ).
      EXIT.
    ENDIF.

    CLEAR result.
    result = http_client->response->get_cdata( )."提取返回字符串

    result = '[' &&  result &&  ']' .
*     ***JSON->内表
    CLEAR:lt_token[],ls_token.
    CALL METHOD /ui2/cl_json=>deserialize
      EXPORTING
        json         = result
        pretty_name  = /ui2/cl_json=>pretty_mode-user
        assoc_arrays = abap_true
      CHANGING
        data         = lt_list.

    IF lt_list IS BOUND.
      ASSIGN lt_list->* TO <data>.

*返回信息有很多层,需要一层一层的剥离到自己需要的组件。
      ASSIGN COMPONENT sy-tabix  OF STRUCTURE <data> TO  <results>.
      LOOP AT <results> ASSIGNING <prod_tab> .
        ASSIGN <prod_tab>->* TO <data>.
        ASSIGN COMPONENT 'DATA' OF STRUCTURE <data> TO <field>  .
        ASSIGN <field>->* TO <data>.
        ASSIGN COMPONENT 'DATAS' OF STRUCTURE <data> TO <field>  .
        ASSIGN <field>->* TO <data>.
      ENDLOOP.

      ASSIGN COMPONENT sy-tabix  OF STRUCTURE <data> TO  <results>.
      IF <field> IS ASSIGNED.
        LOOP AT <results> ASSIGNING <structure>.
          ASSIGN <structure>->* TO <data>.

          ASSIGN COMPONENT `THIRDUSERID` OF STRUCTURE <data> TO <field>.
          IF <field> IS ASSIGNED.
            lt_list = <field>.
            ASSIGN lt_list->* TO <field_value>.
            IF <field_value> IS ASSIGNED.
              ls_final-userid = <field_value>.
            ENDIF.
          ENDIF.
          UNASSIGN: <field>, <field_value>.

          ASSIGN COMPONENT `COMPLETEDALLTIME` OF STRUCTURE <data> TO <field>.
          IF <field> IS ASSIGNED.
            lt_list = <field>.
            ASSIGN lt_list->* TO <field_value>.
            IF <field_value> IS ASSIGNED.
              ls_final-completedalltime = <field_value>.
            ENDIF.
          ENDIF.
          UNASSIGN: <field>, <field_value>.

          APPEND ls_final TO lt_final.
          CLEAR ls_final.
        ENDLOOP.
         lt_list = lt_final.
      ENDIF.
   ENDIF.


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值