二维码

SAP中ABAP格式与JSON格式互转方法研究

Twilight发表于 2017-02-23 09:35zhongguomao 最后回复于 2017-08-26 09:34 [复制链接] 9176 1

一、JSON概念
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

JSON数据格式示例:
  1. {
  2.     "学生": [
  3.         {"姓名":"小明","年龄":23},
  4.         {"姓名":"大憨","年龄":24}
  5.     ]
  6. }
复制代码

一个对象以“{”(左括号)开始,“}”(右括号)结束
一个数组以“[”(左中括号)开始,“]”(右中括号)结束

二、JSON与XML
XML数据格式:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <country>
  3.     <province>
  4.         <name>黑龙江</name>
  5.         <cities>
  6.             <city>哈尔滨</city>
  7.             <city>大庆</city>
  8.         </cities>
  9.     </province>
  10.     <province>
  11.         <name>广东</name>
  12.         <cities>
  13.             <city>广州</city>
  14.             <city>深圳</city>
  15.             <city>珠海</city>
  16.         </cities>
  17.     </province>
  18. </country>
复制代码

编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读。
JSON难阅读,试试:JSON在线编辑器
JSON没有多余的标签,所以JSON比xml网络传输效率更高。

三、JSON与ABAP格式互转
1、cl_trex_json_serializer、cl_trex_json_deserializer方式
  1. DATA: lo_json_ser TYPE REF TO cl_trex_json_serializer,
  2.       lo_json_des TYPE REF TO cl_trex_json_deserializer.
  3. DATA: json_string TYPE string.

  4. DATA:BEGIN OF lt_spfli OCCURS 0,
  5.         carrid    TYPE spfli-carrid,
  6.         connid    TYPE spfli-connid,
  7.         cityfrom  TYPE spfli-cityfrom,
  8.         countryto TYPE spfli-countryto,
  9.      END OF lt_spfli.

  10. START-OF-SELECTION.

  11.   SELECT
  12.     carrid
  13.     connid
  14.     cityfrom
  15.     countryto
  16.   UP TO 10 ROWS
  17.   INTO TABLE lt_spfli
  18.   FROM spfli.


  19. *内表->JSON
  20.   CREATE OBJECT lo_json_ser
  21.     EXPORTING
  22.       data = lt_spfli[].
  23.   CALL METHOD lo_json_ser->serialize.
  24.   CALL METHOD lo_json_ser->get_data
  25.     RECEIVING
  26.       rval = json_string.

  27.   WRITE:json_string.
  28.   CLEAR:lt_spfli[].
  29. *JSON->内表
  30.   CREATE OBJECT lo_json_des.
  31.   CALL METHOD lo_json_des->deserialize
  32.     EXPORTING
  33.       json = json_string
  34.     IMPORTING
  35.       abap = lt_spfli[].
复制代码

json.jpg
该种转换方式,生成的JSON,KEY关键字没有引号,字符串中包含空格,如果与第三方系统做接口时,就会因为JSON格式问题,导致接口失败。

2、CALL TRANSFORMATION id 方式
  1. DATA:BEGIN OF lt_spfli OCCURS 0,
  2.         carrid    TYPE spfli-carrid,
  3.         connid    TYPE spfli-connid,
  4.         cityfrom  TYPE spfli-cityfrom,
  5.         countryto TYPE spfli-countryto,
  6.      END OF lt_spfli.
  7. DATA: lo_writer          TYPE REF TO cl_sxml_string_writer,
  8.       lv_output_length   TYPE i,
  9.       lt_binary_tab      TYPE STANDARD TABLE OF sdokcntbin,
  10.       lv_jsonx           TYPE xstring,
  11.       lv_json            TYPE string.

  12. SELECT  carrid
  13.         connid
  14.         cityfrom
  15.         countryto
  16. UP TO 10 ROWS
  17. INTO TABLE lt_spfli
  18. FROM spfli.

  19. * ABAP to JSON
  20. lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
  21. CALL TRANSFORMATION id SOURCE text = lt_spfli[] RESULT XML lo_writer.
  22. lv_jsonx = lo_writer->get_output( ).

  23. CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  24.   EXPORTING
  25.     buffer        = lv_jsonx
  26.   IMPORTING
  27.     output_length = lv_output_length
  28.   TABLES
  29.     binary_tab    = lt_binary_tab.

  30. CALL FUNCTION 'SCMS_BINARY_TO_STRING'
  31.   EXPORTING
  32.     input_length  = lv_output_length
  33.   IMPORTING
  34.     text_buffer   = lv_json
  35.     output_length = lv_output_length
  36.   TABLES
  37.     binary_tab    = lt_binary_tab.

  38. * JSON to ABAP
  39. CALL TRANSFORMATION id SOURCE XML lv_jsonx RESULT text = lt_spfli.
复制代码

JSON1.jpg
该种JSON转换生成的数据,比内表数据多了一部分“TEXT”字符串,也不是很满意

3、/UI2/CL_JSON方式
  1. DATA: lt_flight TYPE STANDARD TABLE OF sflight,
  2.       lrf_descr TYPE REF TO cl_abap_typedescr,
  3.       lv_json   TYPE string.

  4. SELECT * FROM sflight INTO TABLE lt_flight.

  5. * serialize table lt_flight into JSON, skipping initial fields and converting ABAP field names into camelCase
  6. lv_json = /ui2/cl_json=>serialize( data = lt_flight compress = abap_true pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
  7. WRITE / lv_json.

  8. CLEAR lt_flight.

  9. * deserialize JSON string json into internal table lt_flight doing camelCase to ABAP like field name mapping
  10. /ui2/cl_json=>deserialize( EXPORTING json = lv_json pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = lt_flight ).

  11. * serialize ABAP object into JSON string
  12. lrf_descr = cl_abap_typedescr=>describe_by_data( lt_flight ).
  13. lv_json = /ui2/cl_json=>serialize( lrf_descr ).
  14. WRITE / lv_json.
复制代码

/UI2/CL_JSON方式转换生成的JSON格式就完美了,他不仅支持结构、内表转换成JSON,还支持嵌套结构deep structure这种复杂的结构,了解更多请参考:
https://wiki.scn.sap.com/wiki/display/Snippets/One+more+ABAP+to+JSON+Serializer+and+Deserializer

注意:ABAP中定义变量是不区分大小写,而JAVA中变量是区分大小写的,所以需要对字符串替换一下,如下:
  1. REPLACE ALL OCCURRENCES OF 'contactname' IN post_string WITH 'contactName'.
复制代码
回复

使用道具 举报

zhongguomao
厉害了我的哥,学习加强。
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表