ABAP-获取未知内表转json数据的某个字段信息

本文介绍了在ABAP中如何处理未知内表并将其转换为JSON格式,同时详细讲解了如何从生成的JSON数据中提取特定字段信息。

ABAP-获取未知内表转json数据的某个字段信息

TYPES:BEGIN OF gty_data1,
        index TYPE i,
        pernr TYPE pa0001-pernr,
        name  TYPE pa0002-nachn,
        sex   TYPE char2,
        phone TYPE usrid,
      END OF gty_data1,
      BEGIN OF gty_data2,
        index TYPE i,
        pernr TYPE pa0001-pernr,
        phone TYPE usrid,
      END OF gty_data2,
      BEGIN OF gty_data3,
        index TYPE string,
        pernr TYPE string,
        name  TYPE string,
        sex   TYPE string,
        phone TYPE string,
      END OF gty_data3.

DATA:gt_data1 TYPE TABLE OF gty_data1,
     gt_data2 TYPE TABLE OF gty_data2,
     gt_data3 TYPE TABLE OF gty_data3,
     gt_fcat  TYPE lvc_t_fcat.

DATA:gs_data1 TYPE gty_data1,
     gs_data2 TYPE gty_data2,
     gs_data3 TYPE gty_data3,
     gs_fcat  TYPE lvc_s_fcat.

DATA:serializer   TYPE REF TO cl_trex_json_serializer,
     deserializer TYPE REF TO cl_trex_json_deserializer,
     ref_descr    TYPE REF TO cl_abap_structdescr.

DATA:gv_json TYPE string.

FIELD-SYMBOLS:<dyn_tab> TYPE STANDARD TABLE.

START-OF-SELECTION.

  PERFORM frm_sc_data."生产数据
  PERFORM frm_sc_json."生产json数据
  PERFORM frm_get_data."生成动态内表,
  PERFORM frm_display_data."获取想要数据,显示数据

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  FRM_SC_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_sc_data .
  gs_data1-index = '2'.
  gs_data1-pernr = '10000002'.
  gs_data1-name  = '男2号'.
  gs_data1-sex   = '男'.
  gs_data1-phone = '12568956892'.
  APPEND gs_data1 TO gt_data1.

  gs_data1-index = '3'.
  gs_data1-pernr = '10000003'.
  gs_data1-name  = '女3号'.
  gs_data1-sex   = '女'.
  gs_data1-phone = '12568956893'.
  APPEND gs_data1 TO gt_data1.

  gs_data1-index = '4'.
  gs_data1-pernr = '10000004'.
  gs_data1-name  = '女1号'.
  gs_data1-sex   = '女'.
  gs_data1-phone = '12568956894'.
  APPEND gs_data1 TO gt_data1.

  gs_data1-index = '5'.
  gs_data1-pernr = '10000005'.
  gs_data1-name  = '男5号'.
  gs_data1-sex   = '男'.
  gs_data1-phone = '12568956895'.
  APPEND gs_data1 TO gt_data1.

  gs_data1-index = '6'.
  gs_data1-pernr = '10000006'.
  gs_data1-name  = '男6号'.
  gs_data1-sex   = '男'.
  gs_data1-phone = '12568956896'.
  APPEND gs_data1 TO gt_data1.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SC_DYN_TAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_sc_json .

  CREATE OBJECT serializer
    EXPORTING
      data = gt_data1[].

  serializer->serialize( ).

  gv_json = serializer->get_data( ).

  WRITE: / gv_json.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .

  DATA:dyn_table TYPE REF TO data.

  DATA:lv_p1    TYPE i,
       lv_p2    TYPE i,
       lv_l     TYPE i,
       lv_text  TYPE string,
       lv_text1 TYPE string,
       lv_len   TYPE i,
       lv_field TYPE string,
       lv_index TYPE i.

  SEARCH gv_json FOR '{'.
  IF sy-subrc = 0.
    lv_p1  = sy-fdpos + 1.
  ENDIF.

  SEARCH gv_json FOR '}'.
  IF sy-subrc = 0.
    lv_p2  = sy-fdpos.
  ENDIF.
  lv_l = lv_p2 - lv_p1.
  lv_text = gv_json+lv_p1(lv_l).
  WRITE:/ lv_text.

  DO.

    CLEAR:lv_p1,lv_p2,lv_len.
    lv_len = strlen( lv_text ).
    SEARCH lv_text FOR '"'.
    IF sy-subrc = 0.
      lv_p1  = sy-fdpos.
    ENDIF.

    SEARCH lv_text FOR ','.
    IF sy-subrc = 0.
      lv_p2  = sy-fdpos.
    ENDIF.

    IF lv_p2 IS INITIAL.
      lv_l = lv_len - lv_p1.
    ELSE.
      lv_l = lv_p2 - lv_p1 + 1.
    ENDIF.

    IF lv_p1 IS INITIAL.
      EXIT.
    ENDIF.

    lv_text1 = lv_text+lv_p1(lv_l).
    REPLACE lv_text1 WITH '' INTO lv_text.

  ENDDO.

  WRITE:/ lv_text.

  CONDENSE lv_text NO-GAPS.

  DO.
    lv_index = sy-index.
    SPLIT lv_text AT ':' INTO lv_field lv_text.
    IF sy-subrc = 0.

      gs_fcat-fieldname = lv_field.
      gs_fcat-col_pos   = lv_index.
      gs_fcat-inttype   = 'g'.
*    gs_fcat-intlen    = 8.
*      gs_fcat-scrtext_l = '描述'."加上以后可直接用于ALV显示所需结构

      APPEND gs_fcat TO gt_fcat.

    ELSE.

      EXIT.

    ENDIF.

    IF lv_text IS INITIAL."当字符串为空时,拆分字符sy-subrc= 0
      EXIT.
    ENDIF.

  ENDDO.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_fcat
    IMPORTING
      ep_table        = dyn_table.

  ASSIGN dyn_table->* TO <dyn_tab>.

*  CREATE DATA dyn_line LIKE LINE OF <dyn_tab>."可生产结构
*    ASSIGN dyn_line->* TO <dyn_line>.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_display_data .

  CREATE OBJECT deserializer.
  deserializer->deserialize(
      EXPORTING json = gv_json
      IMPORTING abap = <dyn_tab>  ).

  MOVE-CORRESPONDING <dyn_tab> TO gt_data2.
  LOOP AT gt_data2 INTO gs_data2.
    WRITE:/ gs_data2-index,'-',gs_data2-pernr,'-',gs_data2-phone.
  ENDLOOP.
ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值