Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
REPORT Z_IN_BACK_JSON3.
CLASS json_demo DEFINITION.
PUBLIC SECTION.
CLASS-METHODS main
IMPORTING json1 TYPE string
CHANGING data1 TYPE any..
ENDCLASS.
out->next_section(
`JSON-XML-Representation of the JSON-Data` ).
out->write_xml(
CAST cl_sxml_string_writer( writer )->get_output( ) ).
out->display( ).
ENDMETHOD.
ENDCLASS.
* Rather use https://gist.github.com/mydoghasworms/4888a832e28491c3fe47
* The alternative is a better parser although it is not an emmitter)
*----------------------------------------------------------------------*
* CLASS json_util DEFINITION
*---------------------------------------------------------------------*
*REPORT Z_IN_BACK_JSON3.
data: ZTEST_TT_001 TYPE STANDARD TABLE OF zit11 WITH HEADER LINE.
CLASS json_util DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
data_to_json IMPORTING data TYPE any
RETURNING value(json) TYPE string,
*----------------------------------------------------------------------*
* CLASS json_util IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS json_util IMPLEMENTATION.
METHOD data_to_json.
DATA: lr_desc TYPE REF TO cl_abap_typedescr.
DATA: lr_elem TYPE REF TO cl_abap_elemdescr.
DATA: lr_sdes TYPE REF TO cl_abap_structdescr.
DATA: ls_comp TYPE cl_abap_structdescr=>component.
DATA: lt_comp TYPE cl_abap_structdescr=>component_table.
DATA: lv_json TYPE string.
DATA: lv_field TYPE string.
DATA: lv_value TYPE text255.
CASE lr_desc->type_kind.
WHEN cl_abap_typedescr=>typekind_struct1 OR
cl_abap_typedescr=>typekind_struct2.
json = '{'.
* Use RTTI to discover structure members and process them individually
lr_sdes ?= lr_desc.
lt_comp = lr_sdes->get_components( ).
LOOP AT lt_comp INTO ls_comp.
TO <field>.
* For consecutive elements, add a comma separator after the previous value
IF lv_passed1st = 'X'.
CONCATENATE json ' "' ls_comp-name '": ' lv_json INTO json.
lv_passed1st = 'X'.
ENDIF.
ENDLOOP.
WHEN cl_abap_typedescr=>typekind_table.
json = '['.
AT LAST.
CONTINUE.
ENDAT.
ENDLOOP.
WHEN cl_abap_typedescr=>typekind_dref.
* For data references, dereference the data and call method again
IF sy-subrc = 0.
ELSE.
ENDIF.
WHEN OTHERS.
json = data.
CONDENSE json.
lr_desc->type_kind NE cl_abap_typedescr=>typekind_int2.
ENDIF.
ENDCASE.
ENDMETHOD. "data_to_json
METHOD json_to_data.
IF json NA '{}[]'.
lv_value = json.
data = lv_value.
EXIT.
ENDIF.
IF lr_td->type_kind = cl_abap_typedescr=>typekind_table.
lv_table = 'X'.
ELSE.
ENDIF.
* Reset counters/flags
lv_off = 0.
lv_level = 0.
lv_char = json+lv_off(1).
**********************************************************************
* IN STRING
**********************************************************************
IF lv_instr = 'X'.
IF lv_char = '"'.
IF lv_pchar NE '\'.
ENDIF.
ELSE.
ENDIF.
**********************************************************************
* OUTSIDE STRING
**********************************************************************
ELSE.
IF lv_char CA '{['.
ADD 1 TO lv_level.
ENDIF.
IF lv_level > 1.
ELSE.
* End of a key/value pair (we bump up against delimiter) - pass to next level
* But in table mode, we pass an instance of a row of the table, and afterward
* Inside array in JSON, there are no keys, only list of values, the collected
* value is in lv_key
lr_ttd ?= lr_td.
IF lr_ttd->table_kind = cl_abap_tabledescr=>tablekind_sorted
OR lr_ttd->table_kind = cl_abap_tabledescr=>tablekind_hashed.
ELSE.
ENDIF.
CLEAR <line>.
* special characters
lv_instr = 'X'.
ELSE.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
lv_pchar = lv_char.
ADD 1 TO lv_off.
ENDWHILE.
ENDMETHOD. "json_to_data
TABLES: TEVEN,PA9005.
DATA: HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT .
DATA: WF_STRING TYPE STRING ,
RESULT TYPE STRING ,
R_STR TYPE STRING ,
H_SMS_MSG TYPE CLS_STRING_250.
DATA: PERNR TYPE PA0001-PERNR.
DATA: RESULT_TAB TYPE TABLE OF STRING.
START-OF-SELECTION.
CLEAR WF_STRING .
WF_STRING = 'http://167.0.0.250/cosec/api.svc/attendance-daily?action=get;date-
range=26072011-26072011;range=all;format=xml'.
* CALL METHOD cl_http_client=>create_by_url
* EXPORTING url = wf_string
* IMPORTING client = http_client
* EXCEPTIONS argument_not_found = 1
*plugin_not_active = 2
*internal_error = 3
*OTHERS = 4.
*
*CALL METHOD http_client->send
*EXCEPTIONS
*http_communication_failure = 1
* http_invalid_state = 2.
*
* CALL METHOD http_client->receive
* EXCEPTIONS
* http_communication_failure = 1
*http_invalid_state = 2
* http_processing_failed = 3.
* CLEAR result .
* CLEAR result1.
* result = http_client->response->get_cdata( ).
* result1 = result.
*CONCATENATE 'http://167.0.0.19/cosec/api.svc/event-ta-date?action=get;date-
range='D1'-'D2';format=xml'
*INTO URL.
url =
'http://106.51.130.67:3030/yaragoemrjavaclient/EMRServlet_3/AccountantReport.do?
dateOfReport=2019-07-26&branchdid=-1'.
* url = 'http://167.0.0.250/cosec/api.svc/attendance-daily?action=get;date-
range=26072011-26072011;range=all;format=xml'.
HTTP_CLIENT->SEND( ).
HTTP_CLIENT->RECEIVE( ).
HTTP_CLIENT->RESPONSE->GET_STATUS( IMPORTING CODE = RETURN_CODE ).
CONTENT = HTTP_CLIENT->RESPONSE->GET_CDATA( ).
HTTP_CLIENT->CLOSE( ).
IF RETURN_CODE <> 200.
" damm....
ENDIF.
*lv_json = content.
*lr_data = /ui2/cl_json=>generate( json = lv_json ).
*
*IF lr_data IS BOUND.
* ASSIGN lr_data->* TO <data>.
* ASSIGN COMPONENT 'PROPERTIES' OF STRUCTURE <data> TO <field>.
* IF <field> IS ASSIGNED.
* lr_data = <field>.
* ASSIGN lr_data->* TO <data>.
* ASSIGN COMPONENT 'FIELD1' OF STRUCTURE <data> TO <field>.
* IF <field> IS ASSIGNED.
* lr_data = <field>.
* ASSIGN lr_data->* TO <data>.
* WRITE: <data>. " We got it -> Value1
* ENDIF.
* ENDIF.
*ENDIF.
TYPES: BEGIN OF T_BLOG,
BillAmount(100),
*{ INSERT GAPK901906 1
EID TYPE P LENGTH 10,
*} INSERT
USERID TYPE STRING,
PUNCH1 TYPE STRING,
ENTRY TYPE STRING,
ID TYPE STRING,
DID TYPE STRING,
* description TYPE string,
* creator TYPE string,
* date TYPE string,
END OF T_BLOG,
T_BLOGS TYPE TABLE OF T_BLOG.
END OF node3.
TYPES: BEGIN OF node2,
DepartmentWiseRevenueArr(20),
totRefundAmount(20),
totBillAmount(20),
advanceConsumed(20), "0"
InsuranceAmt(20), "0"
cashAmt(20), "0"
advanceCollected(20), "0"
DueAmount(20), "0"
otherModeAmt(20), "0"
CreditAmount(20), "0"
CoPayAmt(20), "0"
advanceAdjusted(20), "0"
cardAmt(20), "0"
chequeAmt(20), "0"
totalAdvanceCollected(20),
END OF node2.
TYPES: BEGIN OF node1,
DepartmentWiseRevenue(20),
PharmacyRevenue(20),
AccessKeyId(20),
surgeryDetails(20),
CollectionDetails(20),
OpticalRevenu(20),
end of node1.
DATA : xml TYPE string.
DATA : gv_json TYPE string,
gv_json = content.
*REPLACE ALL OCCURRENCES OF REGEX '[ ]' IN gv_json WITH ``.
*REPLACE all occurrences of cl_abap_char_utilities=>newline in gv_json with ''.
CALL METHOD go_json->json_to_data
EXPORTING
json = gv_json
CHANGING
data = gt_itab.
EXPORTING
json1 = gv_json
CHANGING
data1 = gt_itab.
*
CALL TRANSFORMATION wdr_json_xml_to_upper SOURCE XML gv_json
RESULT
XML xml.
*DATA: IXML TYPE REF TO IF_IXML,
* STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY,
* ISTREAM TYPE REF TO IF_IXML_ISTREAM,
* PARSER TYPE REF TO IF_IXML_PARSER,
* DOCUMENT TYPE REF TO IF_IXML_DOCUMENT.
*
*IXML = CL_IXML=>CREATE( ).
* STREAMFACTORY = IXML->CREATE_STREAM_FACTORY( ).
* ISTREAM = STREAMFACTORY->CREATE_ISTREAM_CSTRING( xml ).
* DOCUMENT = IXML->CREATE_DOCUMENT( ).
* PARSER = IXML->CREATE_PARSER( STREAM_FACTORY = STREAMFACTORY
* ISTREAM = ISTREAM
* DOCUMENT = DOCUMENT ).
* PARSER->SET_NORMALIZING( ).
* PARSER->SET_VALIDATING( MODE = IF_IXML_PARSER=>CO_NO_VALIDATION ).
* PARSER->PARSE( ).
*
*
*
*DATA: CNT TYPE I.
* DATA: COLLECTION TYPE REF TO IF_IXML_NODE_COLLECTION,
* COLLECTION1 TYPE REF TO IF_IXML_NODE_COLLECTION,
* NODE TYPE REF TO IF_IXML_NODE,
* ELEMENT TYPE REF TO IF_IXML_ELEMENT,
* INDEX TYPE I,
* INDEX1 TYPE I.
*
*
* COLLECTION = DOCUMENT->GET_ELEMENTS_BY_TAG_NAME( NAME = 'str' ).
* COLLECTION1 = DOCUMENT->GET_ELEMENTS_BY_TAG_NAME( NAME = 'object' ).
*data: text TYPE REF TO IF_IXML_NAMED_NODE_MAP.
* INDEX1 = COLLECTION->GET_LENGTH( )..
* WHILE INDEX < COLLECTION->GET_LENGTH( ).
*
* NODE = COLLECTION1->GET_ITEM( INDEX ).
* ELEMENT ?= NODE->QUERY_INTERFACE( IXML_IID_ELEMENT ).
* INDEX = INDEX + 1.
*
* APPEND INITIAL LINE TO BLOGS ASSIGNING <BLOG>.
**{ INSERT GAPK901906 2
* NODE = ELEMENT->FIND_FROM_NAME( NAME = 'str' ).
* IF NODE IS NOT INITIAL.
* <BLOG>-EID = NODE->GET_VALUE( ).
* <BLOG>-ENTRY = NODE->GET_NAME( ).
* text = NODE->GET_ATTRIBUTES( ).
** <BLOG>-EID = NODE->GET_PARENT( ).
* ENDIF.
*
**} INSERT
*
* NODE = ELEMENT->FIND_FROM_NAME( NAME = 'UserID' ).
* IF NODE IS NOT INITIAL.
* <BLOG>-USERID = NODE->GET_VALUE( ).
* ENDIF.
*
*
* NODE = ELEMENT->FIND_FROM_NAME( NAME = 'EventDateTime' ).
* IF NODE IS NOT INITIAL.
* <BLOG>-PUNCH1 = NODE->GET_VALUE( ).
*ENDIF.
*NODE = ELEMENT->FIND_FROM_NAME( NAME = 'EntryExitType' ).
* IF NODE IS NOT INITIAL.
* <BLOG>-ENTRY = NODE->GET_VALUE( ).
*ENDIF.
*
*NODE = ELEMENT->FIND_FROM_NAME( NAME = 'MasterControllerID' ).
* IF NODE IS NOT INITIAL.
* <BLOG>-ID = NODE->GET_VALUE( ).
*ENDIF.
*
*NODE = ELEMENT->FIND_FROM_NAME( NAME = 'DoorControllerID' ).
* IF NODE IS NOT INITIAL.
* <BLOG>-DID = NODE->GET_VALUE( ).
*ENDIF.
*
*
*ENDWHILE.
BREAK-POINT.