1. 程式人生 > >ABAP DATA 和 JSON之間的轉換

ABAP DATA 和 JSON之間的轉換

   最近在需要使用ECC直接呼叫HTTP服務的第三方服務,ABAP需要對JSON進行序列化和反序列化。
   最開始我找到了cl_trex_json_serializer和cl_trex_json_deserializer,進行序列化和反序列化。cl_trex_json_serializer很好的支援了內表到JSON,轉換很簡單,但是如果需要傳輸的JSON結構很複雜,在序列化的時候需要費很多周折。在使用cl_trex_json_deserializer的時候,也有一些小問題,KEY不能帶雙引號,還必須是大寫。這2個類對於處理固定結構的JSON會很簡單,但是我需要一個通用的方法。
   後面找到了一個牛人寫的自定義類zcl_mdp_json*,它包含deserializer,node,serializer一共三個類。可以很方便的根據引數進行JOSN的序列化和反序列化,它的處理邏輯就是把JSON作為一個物件進行處理,整個JSON是一個ROOT NODE,不停的獲取CHILD NODE,直到到最底層。
   下面是我的DEMO:
REPORT YMM00_ZWY04.

DATA json_response TYPE string.
DATA json_response2 TYPE string.
DATA json_response3 TYPE string.

json_response2 = '{"ErrorNo":"1","UIMessage":"ok","ErrorMessage":"","ErrorType":"0","parameters":{"log_session_id":"20170330102407397_162"},'.
json_response3 = '"sap_test":{"row1":{"func_id":"HG9300008","datetime":"20170330 102407"}}}'
. CONCATENATE json_response2 json_response3 INTO json_response SEPARATED BY cl_abap_char_utilities=>cr_lf . DATA: l_json_root_object TYPE REF TO zcl_mdp_json_node. DATA: l_ErrorType_object TYPE REF TO zcl_mdp_json_node. DATA: l_sap_test_object TYPE REF TO zcl_mdp_json_node. DATA: l_ErrorNo_object TYPE
REF TO zcl_mdp_json_node. DATA: l_sap_test_ROW1_object TYPE REF TO zcl_mdp_json_node. DATA: l_sap_test_func_id_object TYPE REF TO zcl_mdp_json_node. l_json_root_object = zcl_mdp_json_node=>deserialize( json = json_response ). DATA: l_string TYPE STRING. l_ErrorType_object = l_json_root_object->object_get_child_node( KEY = 'ErrorType'). l_sap_test_object = l_json_root_object->object_get_child_node( KEY = 'sap_test'). l_sap_test_ROW1_object = l_sap_test_object->object_get_child_node( KEY = 'row1'). l_sap_test_func_id_object = l_sap_test_ROW1_object->object_get_child_node( KEY = 'func_id'). WRITE: / l_sap_test_func_id_object->VALUE.

PS:發現了一個ABAP Open Source projects,裡面有個zJSON,配合之前的zcl_mdp_json*,我們可以很好的序列化和反序列化各種各樣的JSON了。
另外之前提到的cl_trex_json*,SAP已經不支援了,只能內部使用。所以使用的時候需要謹慎。
zJSON的安裝需要ZSAPLINK,這個百度下就OK了。

如果覺得這篇BLOG對工作有用,請點個贊,贊,贊。哈哈