當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
SAP中ABAP格式与JSON格式互转方法研究
生活随笔
收集整理的這篇文章主要介紹了
SAP中ABAP格式与JSON格式互转方法研究
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、JSON概念
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'. 復制代碼
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中變量是區分大小寫的,所以需要對字符串替換一下,如下:
總結
以上是生活随笔為你收集整理的SAP中ABAP格式与JSON格式互转方法研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个简单的动态内表alv案例
- 下一篇: ALV复制内容到剪贴板