JSON数据转内表
JSON是JavaScript对象表示法(JavaScript Object Notation)的缩写,是一种轻量级的数据交换格式。它是一种基于文本的、独立于平台的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。JSON格式为键值对的集合,其值可以是对象、数组、字符串、数值、布尔值或null等简单数据类型。它已成为大多数Web服务的标准数据格式,被广泛用于前后端数据传输和存储。
在abap中主要调用方法/UI2/CL_JSON=>DESERIALIZE
实现JSON数据转内表数据
实现效果如下:
数据准备:
[
{
"name":"张国立",
"age":12,
"hobby":[
"1",
"2"
]
},
{
"name":"张铁林",
"age":0,
"hobby":[
]
},
{
"name":"邓婕",
"age":12,
"hobby":[
"1",
"2"
]
},
{
"name":"张国立",
"age":12,
"hobby":[
"1",
"2"
]
},
{
"name":"张铁林",
"age":12,
"hobby":[
"1",
"2"
]
},
{
"name":"邓婕",
"age":12,
"hobby":[
"1",
"2"
]
}
]
实现代码:
SELECTION-SCREEN BEGIN OF BLOCK BLK01 WITH FRAME.
PARAMETERS: P_PATH TYPE STRING.
SELECTION-SCREEN END OF BLOCK BLK01.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PATH.
DATA:LT_FTABLE TYPE FILETABLE,
LV_RC TYPE I.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = '选择文件'
CHANGING
FILE_TABLE = LT_FTABLE
RC = LV_RC
EXCEPTIONS
FILE_OPEN_DIALOG_FAILED = 1
CNTL_ERROR = 2
ERROR_NO_GUI = 3
NOT_SUPPORTED_BY_GUI = 4
OTHERS = 5.
IF SY-SUBRC = 0 AND LT_FTABLE IS NOT INITIAL.
READ TABLE LT_FTABLE INTO DATA(LS_FTABLE) INDEX 1.
P_PATH = LS_FTABLE-FILENAME.
ENDIF.
START-OF-SELECTION.
DATA : LT_TABLE TYPE STRING_TABLE. "对应DATA_TAB是没指定类型的 所以就使用STRING_TABLE
DATA:LV_JSON TYPE STRING.
"定义一个JSON对应的结构
TYPES:BEGIN OF TY_DATA,
NAME TYPE STRING,
AGE TYPE I,
HOBBY TYPE STRING_TABLE.
TYPES END OF TY_DATA.
DATA:LT_DATA TYPE TABLE OF TY_DATA.
* DATA:LS_DATA TYPE TY_DATA. “如果是单条数据 就用工作区来接受数据
IF P_PATH IS INITIAL.
MESSAGE 'ERROR PATH' TYPE 'E'.
ENDIF.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
FILENAME = P_PATH
TABLES
DATA_TAB = LT_TABLE
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17.
IF SY-SUBRC <> 0.
MESSAGE 'ERROR READ' TYPE 'E'.
ENDIF.
IF LT_TABLE IS NOT INITIAL.
LOOP AT LT_TABLE INTO DATA(LS_TABLE).
LV_JSON = LV_JSON && LS_TABLE.
CLEAR LS_TABLE.
ENDLOOP.
ENDIF.
"调用方法转换数据
CALL METHOD /UI2/CL_JSON=>DESERIALIZE
EXPORTING
JSON = LV_JSON
CHANGING
DATA = LT_DATA.
* DATA = LS_DATA.
BREAK-POINT.
内表数据转JSON
在接口中有时候会遇到输出JSON数据,此时我们就要将目标内表数据转为JSON,在ABAP中有一个标准的方法可以将内表数据转换为JSON字符串:/UI2/CL_JSON=>SERIALIZE
"内表转Json
DATA:LV_JSON2 TYPE STRING."接收JSON数据字符串
**********************
*这里是根据源代码创建的名称映射表
*java等其他编程语言都是大小写敏感的,所以需要变为对应的名称
TYPES:
BEGIN OF NAME_MAPPING,
ABAP TYPE ABAP_COMPNAME,
JSON TYPE STRING,
END OF NAME_MAPPING .
DATA:
NAME_MAPPINGS TYPE HASHED TABLE OF NAME_MAPPING WITH UNIQUE KEY ABAP . "ABAP和JSON名称映射表
NAME_MAPPINGS = VALUE #(
( ABAP = 'NAME' JSON = 'name' )
( ABAP = 'AGE' JSON = 'age' )
( ABAP = 'HOBBY' JSON = 'hobby' )
)."设置映射值
***********************
CALL METHOD /UI2/CL_JSON=>SERIALIZE
EXPORTING
DATA = LT_DATA
NAME_MAPPINGS = NAME_MAPPINGS
RECEIVING
R_JSON = LV_JSON2.
LT_DATA数据如下:
实现效果如下: