ABAP: Pasar de estructura a JSON

Para pasar el contenido de una estructura a JSON necesitaremos crear una copia de la clase estándar CL_TREX_JSON_SERIALIZER y crear los métodos ZRECURSE y ZSERIALIZE.

Es necesario realizar esta modificación para que el nombre del campo y el valor se incluyan entre comillas dobles, la clase estándar solo incluye entre comillas dobles el valor, con esta modificación obtendremos el siguiente resultado:

Antes

{ Nombre_campo: “Valor”}

 

Después

{ "Nombre_campo": “Valor”}


 

Crear copia de la clase estándar CL_TREX_JSON_SERIALIZER

Entraremos en la transacción SE24 y pulsar sobre el botón de copiar (Dos rectángulos blancos superpuestos) e informar un nuevo nombre para la clase, debe empezar por Z*.

SE24

Crearemos los métodos ZRECURSE y ZSERIALIZE con los mismos parámetros que los estándares.

SE24 metodos Z
 

Contenido del método ZRECURSE

METHOD ZRECURSE .
 
   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 1 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_data( data ) .
      LOOP AT l_typedescr->components ASSIGNING  .
        l_index = sy-tabix .
*        CONCATENATE -name c_colon INTO l_value .
         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 .
 
ENDMETHOD.

 

Contenido del método ZSERIALIZE

METHOD ZSERIALIZE .
 
  FIELD-SYMBOLS  TYPE data .
 
  ASSIGN me->data_ref->* TO  .
  zrecurse(  ) .
 
ENDMETHOD.

 

Utilización de la nueva clase

Declararemos la clase y le pasaremos la estructura con el contenido del JSON, a continuación utilizaremos el método ZSERIALIZE y recuperaremos el valor en un string con el método GET_DATA.

DATA: lc_zserializer TYPE REF TO zcl_trex_json_serializer,
 
  CREATE OBJECT lc_serializer
    EXPORTING
      data = lw_estructura_json.
 
lc_serializer->zserialize( ).
 
lv_string_json = lc_serializer->get_data( ).

 
Para ver mas tutoriales de SAP, pulse en el siguiente enlace: Listado de tutoriales

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *