SHARE
TWEET

Built-in JSON / ABAP transformer

rplantiko Jan 23rd, 2013 2,565 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. *&---------------------------------------------------------------------*
  2. *& Report  ZZ_TEST_JSON
  3. *&---------------------------------------------------------------------*
  4.  
  5. * Testing ABAP's built-in JSON Parser and JSON Builder
  6.  
  7. report  zz_test_json.
  8.  
  9. parameters:
  10. * Convert ABAP data into a JSON string
  11.             p_tojsns radiobutton group 001 default 'X',
  12. * Convert ABAP data into a JSON string and visualize them as HTML doc
  13.             p_tojson radiobutton group 001,
  14. * Convert JSON into an XML representation (JSONXML)
  15.             p_toxml  radiobutton group 001,
  16. * Convert JSON into ABAP (fixed test structure IHTTPNVP)
  17.             p_toabap radiobutton group 001.
  18.  
  19.  
  20. start-of-selection.
  21.   perform start.
  22.  
  23. * ---
  24. form start.
  25.  
  26.   if     p_tojson = 'X'.
  27.     perform abap_to_json.
  28.   elseif p_tojsns = 'X'.
  29.     perform abap_to_json_string.
  30.   elseif p_toabap = 'X'.
  31.     perform json_to_abap.
  32.   else.
  33.     perform json_to_jsonxml.
  34.   endif.
  35.  
  36. endform.                    "start
  37.  
  38.  
  39. *&---------------------------------------------------------------------*
  40. *&      Form  json_to_jsonxml
  41. *&---------------------------------------------------------------------*
  42. form json_to_jsonxml.
  43.  
  44.   data: lv_json type string,
  45.         lo_xmldoc type ref to if_ixml_document.
  46.  
  47.   "JSON to JSON-XML
  48.   lv_json = `{"TEXT":{"NAME":"JSON","VALUE":"cool!"}}`.
  49.   perform edit_string using 'JSON-Daten' changing lv_json.
  50.  
  51.   lo_xmldoc = cl_ixml=>create( )->create_document( ).
  52.   call transformation id source xml lv_json
  53.                          result xml lo_xmldoc.
  54.   call function 'SDIXML_DOM_TO_SCREEN'
  55.     exporting
  56.       document    = lo_xmldoc
  57.       title       = 'JSON-Daten in JSON-XML-Präsentierung'
  58.     exceptions
  59.       no_document = 1
  60.       others      = 2.
  61.  
  62. endform.                    "json_to_abapxml
  63.  
  64. *&---------------------------------------------------------------------*
  65. *&      Form  json_to_abap
  66. *&---------------------------------------------------------------------*
  67. form json_to_abap.
  68.  
  69.   data: lv_json type string,
  70.         ls_text type ihttpnvp,
  71.         lo_xmldoc type ref to if_ixml_document.
  72.  
  73.   "JSON to ABAP
  74.   lv_json = `{"TEXT":{"NAME":"JSON","VALUE":"cool!"}}`.
  75.   perform edit_string using 'JSON-Daten' changing lv_json.
  76.  
  77.   call transformation id source xml lv_json
  78.                          result text = ls_text.
  79.  
  80.   call function 'RS_COMPLEX_OBJECT_EDIT'
  81.     exporting
  82.       object_name          = 'TEXT'
  83.       mode                 = space
  84.     changing
  85.       object               = ls_text
  86.     exceptions
  87.       object_not_supported = 1
  88.       others               = 2.
  89.  
  90. endform.                    "json_to_abap
  91.  
  92. *&---------------------------------------------------------------------*
  93. *&      Form  abap_to_json
  94. *&---------------------------------------------------------------------*
  95. form abap_to_json.
  96.  
  97.   data: lv_data type ref to data,
  98.         lv_json type xstring,
  99.         lo_writer type ref to cl_sxml_string_writer,
  100.         lo_xmldoc type ref to if_ixml_document,
  101.         lv_xml type string.
  102.  
  103.   field-symbols: <lv_data> type any.
  104.  
  105.   perform get_abap_data changing lv_data.
  106.   check lv_data is bound.
  107.   assign lv_data->* to <lv_data>.
  108.  
  109.  
  110.   lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
  111.   call transformation id source root = <lv_data>
  112.                          result xml lo_writer.
  113.   lv_json = lo_writer->get_output( ).
  114.  
  115.  
  116.   perform display_as_html using lv_json.
  117.  
  118.  
  119. endform.                    "abap_to_json
  120.  
  121. *&---------------------------------------------------------------------*
  122. *&      Form  abap_to_json_string
  123. *&---------------------------------------------------------------------*
  124. form abap_to_json_string.
  125.  
  126.   data: lv_data type ref to data,
  127.         lv_json type string,
  128.         lo_writer type ref to cl_sxml_string_writer,
  129.         lo_xmldoc type ref to if_ixml_document,
  130.         lv_xml type string.
  131.  
  132.   field-symbols: <lv_data> type any.
  133.  
  134.   perform get_abap_data changing lv_data.
  135.   check lv_data is bound.
  136.   assign lv_data->* to <lv_data>.
  137.  
  138.   lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
  139.   call transformation id source root = <lv_data>
  140.                          result xml lo_writer.
  141.  
  142.   lv_json = cl_abap_codepage=>convert_from(  lo_writer->get_output( ) ).
  143.  
  144.   call function 'Z_DISPLAY_STRING'
  145.     exporting
  146.       iv_string = lv_json
  147.       iv_title  = 'JSON-Ergebnis'.
  148.  
  149.  
  150.  
  151. endform.                    "abap_to_json_string
  152.  
  153.  
  154.  
  155. *&---------------------------------------------------------------------*
  156. *&      Form  get_abap_data
  157. *&---------------------------------------------------------------------*
  158. form get_abap_data changing ev_data type ref to data.
  159.  
  160.   data: lt_abap type stringtab,
  161.         lv_repid type repid,
  162.         lv_mess type string.
  163.  
  164.   field-symbols: <lv_data> type any.
  165.  
  166.   perform set_test_abap changing lt_abap.
  167.   perform edit_text using 'ABAP Daten erzeugen' changing lt_abap.
  168.  
  169.   generate subroutine pool lt_abap name lv_repid
  170.     message lv_mess.
  171.   if sy-subrc ne 0.
  172.     message lv_mess type 'I'.
  173.     return.
  174.   endif.
  175.  
  176.   perform get_data in program (lv_repid) changing ev_data.
  177.  
  178. endform.                    "get_abap_data
  179.  
  180.  
  181. * ---  Popup zur Eingabe von langen Texten
  182. form edit_text using iv_title type csequence
  183.                changing ct_text type stringtab.
  184.   call function 'TERM_CONTROL_EDIT'
  185.     exporting
  186.       titel          = iv_title
  187.     tables
  188.       textlines      = ct_text
  189.     exceptions
  190.       user_cancelled = 1
  191.       others         = 2.
  192.   if sy-subrc eq 1.
  193.     leave to screen 0.
  194.   elseif sy-subrc ne 0.
  195.     message id sy-msgid type 'A' number sy-msgno
  196.       with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  197.   endif.
  198. endform.                    "edit_text
  199.  
  200. *&---------------------------------------------------------------------*
  201. *&      Form  edit_string
  202. *&---------------------------------------------------------------------*
  203. form edit_string using iv_title type csequence
  204.                  changing cv_string type string.
  205.  
  206.   data: lt_lines type stringtab.
  207.  
  208.   field-symbols: <lv_line> type string.
  209.  
  210.   split cv_string at cl_abap_char_utilities=>cr_lf into table lt_lines.
  211.  
  212.   perform edit_text using iv_title changing lt_lines.
  213.  
  214.   clear cv_string.
  215.   loop at lt_lines assigning <lv_line>.
  216.     concatenate cv_string <lv_line> into cv_string
  217.       separated by cl_abap_char_utilities=>cr_lf.
  218.   endloop.
  219.  
  220. endform.                    "edit_string
  221.  
  222. define _append.
  223.   append &2 to &1.
  224. end-of-definition.
  225.  
  226. *&---------------------------------------------------------------------*
  227. *&      Form  set_test_abap
  228. *&---------------------------------------------------------------------*
  229. form set_test_abap changing ct_abap type stringtab.
  230.  
  231.   _append ct_abap :
  232.     `program data_getter.`,
  233.     `types: begin of ty_data,`,
  234.     `         test1 type i,`,
  235.     `         test2 type ihttpnvp,`,
  236.     `         test3 type string,`,
  237.     `         end of ty_data.`,
  238.     `data: gs_data type ty_data.`,
  239.     `form get_data changing ev_data type ref to data.`,
  240.     `  gs_data-test1 = 17.`,
  241.     `  gs_data-test2-name = 'JSON'.`,
  242.     `  gs_data-test2-value = 'cool'.`,
  243.     `  gs_data-test3 = 'Happy Go Lucky'.`,
  244.     `  get reference of gs_data into ev_data.`,
  245.     `endform.`.
  246.  
  247. endform.                    "set_test_abap
  248.  
  249. *&---------------------------------------------------------------------*
  250. *&      Form  display_as_xhtml
  251. *&---------------------------------------------------------------------*
  252. data: go_cont type ref to cl_gui_custom_container,
  253.       go_html type ref to cl_gui_html_viewer,
  254.       go_doc  type ref to if_ixml_document.
  255. *&---------------------------------------------------------------------*
  256. *&      Form  display_as_xhtml
  257. *&---------------------------------------------------------------------*
  258. form display_as_html using iv_json type xstring.
  259.  
  260.  
  261. * Transform into interactive HTML presentation
  262.   go_doc = cl_ixml=>create( )->create_document( ).
  263.   call transformation sjson2html source xml iv_json
  264.                          result xml go_doc.
  265.  
  266. * Create new Custom Container, new HTML viewer
  267.   clear go_cont.
  268.  
  269.   call screen 100
  270.     starting at 10 10
  271.     ending at 80 20.
  272.  
  273. endform.                    "display_as_html
  274.  
  275.  
  276. *&---------------------------------------------------------------------*
  277. *&      Form  status_0100
  278. *&---------------------------------------------------------------------*
  279. form status_0100.
  280.  
  281.   data: lt_text type tttext255,
  282.         lv_url type text255,
  283.         lv_xml type string.
  284.  
  285.   if go_cont is initial.
  286.     create object go_cont
  287.       exporting
  288.         container_name = 'CONT'.
  289.     create object go_html
  290.       exporting
  291.         parent = go_cont.
  292.     call transformation id source xml go_doc
  293.                            result xml lv_xml.
  294.     replace all occurrences of '&lt;' in lv_xml with '<'.
  295.     replace all occurrences of '&gt;' in lv_xml with '>'.
  296.     call function 'Z_SPLIT_STRING_TO_TABLE'
  297.       exporting
  298.         iv_string = lv_xml
  299.         iv_length = 255
  300.       importing
  301.         et_table  = lt_text.
  302.     go_html->load_data( importing assigned_url = lv_url
  303.                         changing data_table = lt_text ).
  304.     go_html->show_url( lv_url ).
  305.   endif.
  306.   set pf-status 'POPU' of program 'SAPLSPO1'.
  307. endform.                    "status_0100
  308.  
  309. *&---------------------------------------------------------------------*
  310. *&      Form  user_command_0100
  311. *&---------------------------------------------------------------------*
  312. form user_command_0100.
  313.   case sy-ucomm.
  314.     when 'CANC'.
  315.       leave to screen 0.
  316.   endcase.
  317. endform.                    "user_command_0100
  318.  
  319. *----------------------------------------------------------------------*
  320. *  MODULE status_0100 OUTPUT
  321. *----------------------------------------------------------------------*
  322. module status_0100 output.
  323.   perform status_0100.
  324. endmodule.                    "status_0100 OUTPUT
  325. *----------------------------------------------------------------------*
  326. *  MODULE user_command_0100
  327. *----------------------------------------------------------------------*
  328. module user_command_0100.
  329.   perform user_command_0100.
  330. endmodule.                    "user_command_0100
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top