SAP中ABAP格式與JSON格式互轉方法研究
阿新 • • 發佈:2019-02-12
一、JSON概念
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。
JSON資料格式示例:
一個物件以“{”(左括號)開始,“}”(右括號)結束
一個數組以“[”(左中括號)開始,“]”(右中括號)結束
二、JSON與XML
XML資料格式:
編碼的可讀性,xml有明顯的優勢,畢竟人類的語言更貼近這樣的說明結構。json讀起來更像一個數據塊,讀起來就比較費解了。不過,我們讀起來費解的語言,恰恰是適合機器閱讀。
JSON難閱讀,試試:JSON線上編輯器
JSON沒有多餘的標籤,所以JSON比xml網路傳輸效率更高。
三、JSON與ABAP格式互轉
1、cl_trex_json_serializer、cl_trex_json_deserializer方式
該種轉換方式,生成的JSON,KEY關鍵字沒有引號,字串中包含空格,如果與第三方系統做介面時,就會因為JSON格式問題,導致介面失敗。
2、CALL TRANSFORMATION id 方式
該種JSON轉換生成的資料,比內表資料多了一部分“TEXT”字串,也不是很滿意
3、/UI2/CL_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中變數是區分大小寫的,所以需要對字串替換一下,如下:
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。
JSON資料格式示例:
-
{
-
"學生": [
-
{"姓名":"小明","年齡":23},
-
{"姓名":"大憨","年齡":24}
-
]
- }
一個物件以“{”(左括號)開始,“}”(右括號)結束
一個數組以“[”(左中括號)開始,“]”(右中括號)結束
二、JSON與XML
XML資料格式:
-
<?xml version="1.0" encoding="utf-8"?>
-
<country>
-
<province>
-
<name>黑龍江</name>
-
<cities>
-
<city>哈爾濱</city>
-
<city>大慶</city>
-
</cities>
-
</province>
-
<province>
-
<name>廣東</name>
-
<cities>
-
<city>廣州</city>
-
<city>深圳</city>
-
<city>珠海</city>
-
</cities>
-
</province>
- </country>
編碼的可讀性,xml有明顯的優勢,畢竟人類的語言更貼近這樣的說明結構。json讀起來更像一個數據塊,讀起來就比較費解了。不過,我們讀起來費解的語言,恰恰是適合機器閱讀。
JSON難閱讀,試試:JSON線上編輯器
JSON沒有多餘的標籤,所以JSON比xml網路傳輸效率更高。
三、JSON與ABAP格式互轉
1、cl_trex_json_serializer、cl_trex_json_deserializer方式
-
DATA: lo_json_ser TYPE REF TO cl_trex_json_serializer,
-
lo_json_des TYPE REF TO cl_trex_json_deserializer.
-
DATA: json_string TYPE string.
-
DATA:BEGIN OF lt_spfli OCCURS 0,
-
carrid TYPE spfli-carrid,
-
connid TYPE spfli-connid,
-
cityfrom TYPE spfli-cityfrom,
-
countryto TYPE spfli-countryto,
-
END OF lt_spfli.
-
START-OF-SELECTION.
-
SELECT
-
carrid
-
connid
-
cityfrom
-
countryto
-
UP TO 10 ROWS
-
INTO TABLE lt_spfli
-
FROM spfli.
-
*內表->JSON
-
CREATE OBJECT lo_json_ser
-
EXPORTING
-
data = lt_spfli[].
-
CALL METHOD lo_json_ser->serialize.
-
CALL METHOD lo_json_ser->get_data
-
RECEIVING
-
rval = json_string.
-
WRITE:json_string.
-
CLEAR:lt_spfli[].
-
*JSON->內表
-
CREATE OBJECT lo_json_des.
-
CALL METHOD lo_json_des->deserialize
-
EXPORTING
-
json = json_string
-
IMPORTING
- abap = lt_spfli[].
該種轉換方式,生成的JSON,KEY關鍵字沒有引號,字串中包含空格,如果與第三方系統做介面時,就會因為JSON格式問題,導致介面失敗。
2、CALL TRANSFORMATION id 方式
-
DATA:BEGIN OF lt_spfli OCCURS 0,
-
carrid TYPE spfli-carrid,
-
connid TYPE spfli-connid,
-
cityfrom TYPE spfli-cityfrom,
-
countryto TYPE spfli-countryto,
-
END OF lt_spfli.
-
DATA: lo_writer TYPE REF TO cl_sxml_string_writer,
-
lv_output_length TYPE i,
-
lt_binary_tab TYPE STANDARD TABLE OF sdokcntbin,
-
lv_jsonx TYPE xstring,
-
lv_json TYPE string.
-
SELECT carrid
-
connid
-
cityfrom
-
countryto
-
UP TO 10 ROWS
-
INTO TABLE lt_spfli
-
FROM spfli.
-
* ABAP to JSON
-
lo_writer = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
-
CALL TRANSFORMATION id SOURCE text = lt_spfli[] RESULT XML lo_writer.
-
lv_jsonx = lo_writer->get_output( ).
-
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
-
EXPORTING
-
buffer = lv_jsonx
-
IMPORTING
-
output_length = lv_output_length
-
TABLES
-
binary_tab = lt_binary_tab.
-
CALL FUNCTION 'SCMS_BINARY_TO_STRING'
-
EXPORTING
-
input_length = lv_output_length
-
IMPORTING
-
text_buffer = lv_json
-
output_length = lv_output_length
-
TABLES
-
binary_tab = lt_binary_tab.
-
* JSON to ABAP
- CALL TRANSFORMATION id SOURCE XML lv_jsonx RESULT text = lt_spfli.
該種JSON轉換生成的資料,比內表資料多了一部分“TEXT”字串,也不是很滿意
3、/UI2/CL_JSON方式
-
DATA: lt_flight TYPE STANDARD TABLE OF sflight,
-
lrf_descr TYPE REF TO cl_abap_typedescr,
-
lv_json TYPE string.
-
SELECT * FROM sflight INTO TABLE lt_flight.
-
* serialize table lt_flight into JSON, skipping initial fields and converting ABAP field names into camelCase
-
lv_json = /ui2/cl_json=>serialize( data = lt_flight compress = abap_true pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
-
WRITE / lv_json.
-
CLEAR lt_flight.
-
* deserialize JSON string json into internal table lt_flight doing camelCase to ABAP like field name mapping
-
/ui2/cl_json=>deserialize( EXPORTING json = lv_json pretty_name = /ui2/cl_json=>pretty_mode-camel_case CHANGING data = lt_flight ).
-
* serialize ABAP object into JSON string
-
lrf_descr = cl_abap_typedescr=>describe_by_data( lt_flight ).
-
lv_json = /ui2/cl_json=>serialize( lrf_descr ).
- 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中變數是區分大小寫的,所以需要對字串替換一下,如下:
- REPLACE ALL OCCURRENCES OF 'contactname' IN post_string WITH 'contactName'.