ABAP中如何无大量换行格式化编写长JSON字符串字面量?
ABAP中JSON相关常见问题解答
1. 无需大量换行/格式化编写长JSON字符串字面量
- 直接拼接字符串:ABAP支持用
&&直接拼接多行字符串,无需额外换行符,示例:DATA(lv_json) = `{"key1":"value1","key2":"value2"` && `"key3":"value3","key4":"value4"}`. - 用INCLUDE嵌入:将JSON内容单独存入文本INCLUDE(通过SE38创建,类型选“文本”),在程序中用
INCLUDE <INCLUDE_NAME>.引入即可,注意INCLUDE内的内容要符合ABAP字符串语法,比如用反引号包裹或处理好引号转义。 - 类JS模板字符串的替代方案:ABAP无原生模板字符串,但7.02及以上版本支持字符串模板,通过
&插入变量,示例:DATA(lv_key) = `key1`. DATA(lv_value) = `value1`. DATA(lv_json) = |{"{lv_key}":"{lv_value}","key2":"value2"}|.
2. 类似JSON.stringify的序列化方法
- 使用
/UI2/CL_JSON类:通过该类的serialize方法将内表或结构体转为JSON字符串,示例:TYPES: BEGIN OF ty_data, key1 TYPE string, key2 TYPE string, END OF ty_data. DATA(ls_data) = VALUE ty_data( key1 = `value1` key2 = `value2` ). DATA(lv_json) = /UI2/CL_JSON=>serialize( data = ls_data ). - ABAP 7.50+内置
JSON函数:语法更简洁,示例:DATA(lv_json) = JSON( VALUE ty_data( key1 = `value1` key2 = `value2` ) ).
3. 更优的JSON解析方式
无需先反序列化到临时内表再循环插入字典表,直接反序列化为目标结构即可:
- 用
/UI2/CL_JSON直接反序列化:DATA(lt_dict) = VALUE ty_dict_table( ). /UI2/CL_JSON=>deserialize( EXPORTING json = lv_json CHANGING data = lt_dict ). - ABAP 7.50+内置
JSON函数反序列化:DATA(lt_dict) = JSON( lv_json OPTIONS INTO DATA(lo_options) ). lo_options->set( name = if_json=>case_sensitive value = abap_true ).
4. 解析文件中JSON的实现
读取本地文件(前端)
DATA(lt_lines) TYPE string_table. CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = `C:\test.json` filetype = `ASC` CHANGING data_tab = lt_lines. " 拼接为完整JSON字符串 CONCATENATE LINES OF lt_lines INTO DATA(lv_json_content) SEPARATED BY cl_abap_char_utilities=>newline. " 反序列化到目标结构 DATA(lt_data) = VALUE ty_data_table( ). /UI2/CL_JSON=>deserialize( EXPORTING json = lv_json_content CHANGING data = lt_data ).
读取应用服务器文件
DATA(lv_json_content) TYPE string. OPEN DATASET `/usr/test.json` FOR INPUT IN TEXT MODE ENCODING DEFAULT. READ DATASET `/usr/test.json` INTO lv_json_content. CLOSE DATASET `/usr/test.json`. " 后续反序列化步骤同上
内容的提问来源于stack exchange,提问作者MarcL
相关产品推荐
相关产品推荐

