Tuesday, August 27, 2013

ABAP to JSON / SAP Internal Table to JSON

ABAP TO JSON Parser:
There is a standard class : CL_TREX_JSON_SERIALIZER available to convert Internal table to JSON format.
Usage:
DATA lr_json TYPE REF TO cl_trex_json_serializer.


  
CREATE OBJECT lr_json
    
EXPORTING
      
data lt_accounts.

  lr_json
->serialize( ).

  
DATA lv_jsonstr TYPE string.


  lv_jsonstr 
lr_json->get_data( ).



The standard class as is might not be give you an acceptable JSON format, make the following enhancements to fix this:
  1. Using Enhancement Framework, add a new Method “ZRECURSE” copying “RECURSE”
 DATA:
    l_type  
TYPE c ,
    l_comps 
TYPE i ,
    l_lines 
TYPE i ,
    l_index 
TYPE i ,
    l_value 
TYPE string .
  
FIELD-SYMBOLS:
     
TYPE ANY TABLE ,
     
TYPE any .

  
DESCRIBE FIELD data TYPE l_type COMPONENTS l_comps .

  
IF l_type cl_abap_typedescr=>typekind_table .
*   itab -> array
    
APPEND '[' TO me->fragments .
    
ASSIGN data TO  .
    l_lines 
lines ) .
    
LOOP AT  ASSIGNING  .
      
ADD TO l_index .
      zrecurse
 ) .
      
IF l_index < l_lines .
        
APPEND c_comma TO me->fragments .
      
ENDIF .
    
ENDLOOP .
    
APPEND ']' TO fragments .
  
ELSE .
    
IF l_comps IS INITIAL .
*     field -> scalar
*     todo: format
      l_value 
data .
      
REPLACE ALL OCCURRENCES OF '\' IN l_value WITH '\\' .
      
"REPLACE ALL OCCURRENCES OF '''' IN l_value WITH '\''' .
      
REPLACE ALL OCCURRENCES OF '"' IN l_value WITH '\"' .
      
"REPLACE ALL OCCURRENCES OF '&' IN l_value WITH '\&' .
      
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN l_value WITH '\r\n' .
      
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN l_value WITH '\n' .
      
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>horizontal_tab IN l_value WITH '\t' .
      
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>backspace IN l_value WITH '\b' .
      
REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>form_feed IN l_value WITH '\f' .
      
CONCATENATE '"' l_value '"' INTO l_value .
      
APPEND l_value TO me->fragments .
    
ELSE .
*     structure -> object
      
DATA l_typedescr TYPE REF TO cl_abap_structdescr .
      
FIELD-SYMBOLS  TYPE abap_compdescr .

      
APPEND '{' TO me->fragments .
      l_typedescr ?= cl_abap_typedescr
=>describe_by_datadata ) .
      
LOOP AT l_typedescr->components ASSIGNING  .
        l_index 
sy-tabix .
        
CONCATENATE '"' -name '"'  c_colon INTO l_value .
        
TRANSLATE l_value TO LOWER CASE .
        
APPEND l_value TO me->fragments .
        
ASSIGN COMPONENT -name OF STRUCTURE data TO  .
        zrecurse
 ) .
        
IF l_index < l_comps .
          
APPEND c_comma TO me->fragments .
        
ENDIF .
      
ENDLOOP .
      
APPEND '}' TO me->fragments .
    
ENDIF .
  
ENDIF .
  1. Create a new method “ZSERIALIZE”  copying method “SERIALIZE” and put the below code
METHOD zserialize .
  
FIELD-SYMBOLS  TYPE data .

  
ASSIGN me->data_ref->TO  .
  zrecurse
 ) .
ENDMETHOD.
  1. Now change the usage to the new method “zserialize” instead of “serialize” as shown below
  DATA lr_json TYPE REF TO cl_trex_json_serializer.


  
CREATE OBJECT lr_json
    
EXPORTING
      
data lt_accounts.

  lr_json
->zserialize( ).

  
DATA lv_jsonstr TYPE string.


  lv_jsonstr 
lr_json->get_data( ).

3 comments:

  1. sir how can we consme json format webservice in abap code.

    ReplyDelete
  2. In source code, all field symbols is disappeared. Please trubleshoot it.

    ReplyDelete

Icons legend of SAP BW Objects